最適戦略 超難問?

このQ&Aのポイント
  • 10枚のカードに数値が書かれてあり、見えないようにして置かれています。書かれている数値は全て異なっており、最大値も分かりません。
  • カードを1枚ずつめくっていき、最大値であろうと思われるところで1枚キープできます。キープ宣言はめくった直後のカードについてのみできます。全てのカードを見終わった後、キープしていたカードが最大値なら勝利となります。
  • 勝利する確率を最大にするための戦略は結構難問であり、答えがあるかどうかも不明です。現時点の思いついた戦略は、最初の5枚をめくり、その中で最大値を記憶します。続けて6枚目から順にめくり、記憶していた最大値より大きな数が出たらそれをキープして終了するという戦略です。
回答を見る
  • ベストアンサー

最適戦略 超難問?

次のようなゲームを考えます。 (1)10枚のカードに数値が書かれてあり、見えないようにして置かれています。 (2)書かれている数値は全て異なっていますが、連続しているわけでもなく、最大値も知らされていません。 (3)カードを1枚づつめくっていき、最大値であろうと思われるところで1枚キープできます。キープ宣言はめくった直後のカードについてのみできます。 (4)めくったカードの数値はもちろん記憶しておいてかまいません。(記録しておいてもOK) (5)全てのカードをさらして、キープしていたカードが最大値なら勝利です。最大値でなければ負けです。 問題:勝利する確率を最大にする戦略を考えなさい。 結構難問です。答えがあるのかどうかも不明です。 とりあえず思いついた戦略:5枚とりあえずめくってみる。その中の最大値を記憶。6枚目から順にめくって記憶した最大値より大きかったらキープして終了。 こうすると、 a)前半5枚に最大値が入っていれば、負け 1/2 b)前半5枚に2番目に大きなカードが入っていて、後半5枚に最大値が入っていれば、勝ち 1/2 x 1/2 c)前半5枚に3番目に大きなカードが入っており、後半5枚に最大値が2番目より先に入っていれば、勝ち ・・・うーむ難しい。 そもそもこんな考え方でよいのか? 何枚か捨ててその情報を頼りに後半勝負するしかないような? 5枚がよいのかどうか? もともとの問題は、カードn枚でキープできるカードはk枚となっていますが、難しすぎるので10枚、1枚で限定しました。

質問者が選んだベストアンサー

  • ベストアンサー
  • nag0720
  • ベストアンサー率58% (1093/1860)
回答No.3

キープが複数のときの戦略は、ご友人のほうがはるかにいいですね。 n=100,k=3の場合のその戦略の確率を計算してみました。 最大のカードがi番目にあるときに、それをキープする確率をQ(i)とすれば、求める確率は、 (1/n)Σ[i=1・・・n]Q(i) Q(i)は、 i≦m1 のとき、Q(i)=0 m1<i≦m2 のとき、Q(i)=m1/(i-1) m2<i≦m3 のとき、Q(i)=m2/(i-1) m3<i のときは、 Q(i)=(1-m1/m2)(1-m2/m3)(m3/(i-1))    +{(1-m1/m2)(m2/m3)+(m1/m2)(1-m2/m3)}{1-(i-m3-1)(i-m3-2)/((i-1)(i-2))}    +(m1/m3){1-(i-m3-1)(i-m3-2)(i-m3-3)/((i-1)(i-2)(i-3))} m1=14, m2=32, m3=64 のときは、0.6725479 m1=13, m2=28, m3=45 のときに、最大0.7012128になるようです。

MagicianKuma
質問者

お礼

確率式まで求めていただいて恐縮です。 戦略は考えようでいくらでもありそうで最適なのを見つけるのは相当難しいですね。 最適であるとの証明もできそうもないし。

その他の回答 (2)

  • nag0720
  • ベストアンサー率58% (1093/1860)
回答No.2

>nをどんどん大きくしたらどうなるかは不明です。 予想ですが、nを十分大きくすれば、 1/k+1/(k+1)+1/(k+2)+・・・・+1/(n-1)≒∫[k→n](1/x)dx=log(n/k)=1 より、 k/n=1/e≒0.36787944 に収束するのでしょう。 カードn枚でキープできるカードがk枚の場合を考えてみました。 戦略は、 はじめのm枚は見逃す。 m+1枚目からは、はじめのm枚のカードより大きかったらキープする。 1枚でもキープしたあとは、直前にキープした数より大きかったらさらにキープする。 これを、キープがk枚になるまで繰り返す。 この戦略で勝つ確率は、 最大値のカードがはじめのm枚に入っていたら、0 最大値のカードがm+1~m+k枚目に入っていたら、必ず選ばれるので、k/n 最大値のカードがi枚目(m+k+1≦i≦n)の場合は、詳しい説明は省きますが、 1/n × (1-C(i-m-1,k)/P(i-1,k)) となります。 よって、勝利する確率は、 k/n+(1/n)Σ[i=m+k+1・・・n]((1-C(i-m-1,k)/P(i-1,k)) =1-m/n-(1/n)Σ[i=m+k+1・・・n]C(i-m-1,k)/P(i-1,k) ただし、P,Cは順列、組み合わせの数です。 P(n,k)=nPk C(n,k)=nCk

MagicianKuma
質問者

お礼

度々の回答ありがとうございます。こんなところにもeがでてきますか。数学って面白いですね。 提案された戦略でシミュレーションしてみます。友人が考えている戦略は似ていますがちょい違ってます。 k=3で説明すると。m1<m2<m3の3カ所を決めておきます。 (1)1番目からm1目までは捨てます。 (2)m1+1以降、m1までの最高値を超えたらキープします。それがk1番目だとして、 (3)k1<m2ならm2までは無条件に捨てます。k2>=m2なら(4)の処理。 (4)それ以降は、それまでの最高値を超えたらキープします。それがk2番目だとして、 (5)k2<m3ならm3までは無条件に捨てます。k2>=m3なら(6)の処理。 (6)それ以降は、それまでの最高値を超えたらキープします。 ようはキープしたカードの位置によって無条件に捨てる区間を設ける訳です。 n=100,k=3のときm1=14,m2=32,m3=64で確率約0.7

  • nag0720
  • ベストアンサー率58% (1093/1860)
回答No.1

古くからある「見合いの問題」や「海辺の美女問題」に似ていますが、最大値かどうかだけならこのゲームのほうが簡単でしょう。 キープできるカードが複数の場合は難しいでしょうが。 戦略としては、何枚か捨ててそのあとにそれより大きい数を選ぶという方法しかないように思います。 で、5枚捨てる場合の確率ですが、 もし最大値のカードが前半5枚に入っていたら勝つ確率は、0 最大値のカードが6枚目だったら、必ずそれが選ばれるので勝つ確率は、1/10 最大値のカードが7枚目だったら、はじめの6枚の中の最大値が前半5枚に入っていたら、7枚目が選ばれるので勝つ確率は、1/10×5/6 同様に、最大値のカードが8枚目だったら、それが選ばれるので勝つ確率は、1/10×5/7 最大値のカードが9枚目だったら、それが選ばれるので勝つ確率は、1/10×5/8 最大値のカードが10枚目だったら、それが選ばれるので勝つ確率は、1/10×5/9 よって、最大値のカードが選ばれる確率は、 1/10+1/10×5/6+1/10×5/7+1/10×5/8+1/10×5/9=5/10×(1/5+1/6+1/7+1/8+1/9) 一般化して、最初にk枚捨てる場合の勝つ確率P(k)は、 P(k)=k/10×(1/k+1/(k+1)+1/(k+2)+・・・・+1/9) kがいくつのときP(k)が最大になるかを調べると、 P(k+1)-P(k)=(1/(k+1)+1/(k+2)+・・・・+1/9-1)/10 なので、 1/4+1/5+1/6+1/7+1/8+1/9≒0.9956<1 1/3+1/4+1/5+1/6+1/7+1/8+1/9≒1.3289>1 より、k=3のとき最大になることが分かります。 よって、最善の戦略は、 最初に3枚のカードを捨てて、4枚目から最初に3枚のカードより大きかったらキープする。

MagicianKuma
質問者

お礼

おお!すばらしい。調和級数がでてくるのですね。ありがとうございます。 パソコンで順列を生成してシミュレーションした結果とぴったり一致しました。 また教えていただいた式でnを変えて計算してみると、 n=10 :k=3 P(k)=約0.399 n=100 :k=37 P(k)=約0.371 n=1000:k=368 P(k)=約0.368 n=2000:k=736 P(k)=約0.368 ・・・となりました。 nをどんどん大きくしたらどうなるかは不明です。収束するようなしないような・・・ キープできる枚数が複数のときの戦略は方針さえまだ浮かんでおりません。

関連するQ&A

  • エクセルでひとつのセルに文字と関数を混在させたい

    サッカーのスコア表を作りました。 3-2 2-1 0-2 (-の左と右の数値はそれぞれ独立したセル) そこで上のようなデータを X勝Y敗と自動的に算出したいのですが、 算出結果の「X勝Y敗」を、ひとつのセル内で表示することはできるのでしょうか。 つまり、このセルの中を、 「勝利数のカウント・固定文字"勝"・敗北数のカウント・固定文字"敗"」 と、文字と計算を混在させたいんです。 計算する関数そのものは分かりますが、文字と計算式の混在のさせかたが分かりません(汗)

  • Jリーグの歴史において質問です。

    これまでの19年間(これから20年目に突入しますが)で、全ての試合がホームチームの勝ちであったり、あるいは、負けであったり、引き分けであったり、といった事はあったのでしょうか? 昔、セリエAでは全試合引き分けがあったと記憶しておりますが。 私はJリーグに詳しくありませんので、詳しい方、ご教授願います。

  • 順番に取り除き最後に残るカード

    1 から n の番号がそれぞれ書かれた n 枚のカードがある。 このカードを昇順に並べ、小さい方から t 番目のカードを順に取り除くことを考える。 t は n を超えてもよい。 1回目は t 番目のカードを取り除き、2回目以降は、その前に選ばれたカードから t 番目のカードを取り除く。 最大数のカードの次は、最小数のカードに戻る。 取り除くカード : # 既に取り除いたカード : - ▼ t = 1 のとき 1 2 3 4 5 6 7 8 # 2 3 4 5 6 7 8 - # 3 4 5 6 7 8 - - # 4 5 6 7 8 - - - # 5 6 7 8 - - - - # 6 7 8 - - - - - # 7 8 - - - - - - # 8 - - - - - - - 8 最後に残ったカードは 8 ▼ t = 2 のとき 1 2 3 4 5 6 7 8 1 # 3 4 5 6 7 8 1 - 3 # 5 6 7 8 1 - 3 - 5 # 7 8 1 - 3 - 5 - 7 # 1 - # - 5 - 7 - 1 - - - 5 - # - 1 - - - # - - - 1 - - - - - - - 最後に残ったカードは 1 ▼ t = 3 のとき 1 2 3 4 5 6 7 8 1 2 # 4 5 6 7 8 1 2 - 4 5 # 7 8 # 2 - 4 5 - 7 8 - 2 - 4 # - 7 8 - # - 4 - - 7 8 - - - 4 - - 7 # - - - # - - 7 - - - - - - - 7 - 最後に残ったカードは 7 ▼ t = 4 のとき 1 2 3 4 5 6 7 8 1 2 3 # 5 6 7 8 1 2 3 - 5 6 7 # 1 2 3 - # 6 7 - 1 # 3 - - 6 7 - # - 3 - - 6 7 - - - # - - 6 7 - - - - - - 6 # - - - - - - 6 - - 最後に残ったカードは 6 自然数 n, x(≦n) が与えられたとき、最後に残るカードが x となるような t を求めるにはどのように考えればよいのでしょうか…? また、題意を満たす t のうち、最小の t を求める導出式は考えられるのでしょうか…? ご教示いただければ幸いです。

  • C言語について

    C言語のじゃんけんゲームを作成したいのですが、 仕様は 1.利用者とコンピュータによる対戦形式とします。 2.利用者がキーボードから入力した手(グー・チョキ・パー)と、擬似乱数を用いて生成したコンピュータの手を比較し、利用者の勝ち・あいこ・負けの結果を表示しなさい。 3.利用者の入力が不正の場合には再度入力を促すなど、適切な処理をしなさい。 4.これまでの累積勝利数・引き分け数・敗北数をそれぞれ、user_win・user_draw・user_loseの3つの変数(int型)に格納しなさい。 5.連勝中の場合は「5連勝中!」などと表示させるようにしなさい。 6.あいこである限りは自動的にじゃんけんを反復しなさい。 7.勝敗がついた場合、利用者にまだ継続するか質問した上で、じゃんけんを反復させなさい。 8.じゃんけんを終了した場合、これまでの通算成績として、累積勝利数・引き分け数・敗北数のほか、勝利=累積勝利数÷(累積勝利数+累積敗北数)×100、および、最大勝利数を計算して表示しなさい。 という仕様のじゃんけんゲームを作成したいのですが、下記に書いているまでしかできません。誰か教えていただけないでしょうか。分からなくて困っています。 #include <stdio.h> #include <stdlib.h> #include <time.h> int main(){ int a,c; srand(time(NULL)); c = rand()%3+1; printf("手を入力してください [1:グー 2:チョキ 3:パー] "); scanf("%d",&a); if(a==1 && c==1) printf("あなたはグーで、私もグーでした。アイコです。\n"); else if(a==1 && c==2) printf("あなたはグーで、私はチョキでした。あなたの勝ちです。\n"); else if(a==1 && c==3) printf("あなたはグーで、私はパーでした。あなたの負けです。\n"); else if(a==2 && c==1) printf("あなたはチョキで、私はグーでした。あなたの負けです。\n"); else if(a==2 && c==2) printf("あなたはチョキで、私もチョキでした。アイコです。\n"); else if(a==2 && c==3) printf("あなたはチョキで、私はパーでした。あなたの勝ちです。\n"); else if(a==3 && c==1) printf("あなたはパーで、私はグーでした。あなたの勝ちです。\n"); else if(a==3 && c==2) printf("あなたはパーで、私はチョキでした。あなたの負けです。\n"); else if(a==3 && c==3) printf("あなたはパーで、私もパーでした。アイコです。\n"); else printf("正しい手を入れてください。\n"); return 0; }

  • 確率の問題を教えて下さい。

    確率の問題を教えて下さい。 [問]3人がじゃんけんで1.2.3番を決める。ちょうどn回目で3人の順位が確定する確率P(n)を求めよ。   ただし、3人ともグー、チョキ、パーを出す確率はすべて1/3とする。  最初、3人でじゃんけんをするときは、あいこ、一人が勝、一人が負けの確立が各々1/3  のこりの2人でじゃんけんをする場合、あいこの確率が1/3、勝敗がきまる場合が2/3となると思います。  ここで詰まっています。よろしくお願いいたします。

  • ギャンブルの負けをギャンブルで取り戻したいです

    競輪、競馬で考えています。 今現在、半年で20万円くらいの損失です。 いつも1レースあたりの投資額は1500円程度です。 競馬が終わった後、ナイト競輪の流れが多いです。 私の賭け方は、競馬の場合は地方競馬、南関東競馬で5~12頭の頭数少なめなレースで人気寄りの1・2頭軸の馬単、3連単、1頭軸の相手6頭の3連複です。 競輪の場合はナイト競輪を6~7車立てのレースで人気のラインから2車単、3連単を買っています。 買うのが人気寄りなのでよく当たりはしてもトリガミが多いです。 当たらない日は1日最大1万円台前半の負けで、大きく当たっても100円が2万円台が最大です。 勝ち額が少ないために、少しずつ負けが積み重なっている状態です。 一発逆転できたらいいと思って、競馬は時々中穴から買ってみてもまず当たりません。 ずっと買い続ければ当たると思いますが、当たるまでの損失を入れたら大きく当たっても結局負けは取り戻せないと思ってしまいます。 ゆっくり数か月に渡って取り戻すのでもいいです。 そもそもギャンブル自体やめた方がいい、他のことでお金を取り戻すというのはなしで。 どのような式別や賭け方がおすすめでしょうか。

  • 今、学校の課題で自分にとっては難しい課題がでています

    今、学校の課題で自分にとっては難しい課題がでています 本当は取る予定の科目でなかったため大変で・・・・・ とりあえずとっかかりすら見つかりません(゜ー゜;Aアセアセ 以下、課題です・・・・ ハーフカード : 数値を二分の一倍します 反転カード  : 数値の符号を反転します 二乗カード  : 数値を二乗します プレイヤーは配られたすべてのカードを一回ずつ使います。(今回の場合三枚です) たとえば「二乗」二枚と「ハーフ」「反転」を一枚ずつの合計4枚のカードが配られ、出題された整数が3、目標値が16のとき以下の手順でプレイヤーの勝利となります。 3 → 二乗 → 9 → ハーフ → 4 → 反転 → -4 → 二乗 →16 とっかかりだけでいいので、これからの方針などを教えていただければ嬉しいです ↑くわしく教えていただければ最高なのですがそれは高望みですよね・・・・・ とりあえず、どうぞよろしくお願いします!! m(。≧Д≦。)m

  • 昔、スウェーデンにいた頃によく遊んだのですが、名前

    昔、スウェーデンにいた頃によく遊んだのですが、名前がどうしても思い出せません。最大4人でサイコロ振ってコマを進めるボードゲームで、自分の持ち駒4体を中央の上がり場所へ全て到着させたら勝ちというシンプルなものです。スウェーデンの歌手グループABBA、プロモーションビデオでも遊んでいた記憶があります。子供の頃なので不確かですが、どなたかご存知でしょうか?

  • KProbeの速度と結果の違い

    SOHC-5232K を使用して KProbe で計測しています。焼きは ND-3500A です。 同じメーカー製(型番同じ)を計測して(1ECC) ディスクA MAX測定・・・前半後半とも平均的(PI 5) 4x測定・・・前半後半とも平均的(PI 5) ディスクB MAX測定・・・後半右上がり(数値的に前半PI 5、後半徐々に右上がり最大PI 10~20の数値) 4x測定・・・前半後半とも平均的(PI 5) ディスクA、B共5回計測しました。 これまでこのメーカー(国内大手)を使用していつも ディスクA のような結果だったのですが先日購入した ディスクB は 4x測定 では ディスクA と同じぐらいだったのですが MAX測定 すると ディスクA に比べて後半は数倍の値になりました。ディスクB と同じパック内のディスクも8枚使用しましたが ディスクB と似たような結果でした。 ディスクB に大切なデータを記録して大丈夫か不安になり質問させて頂きました。 KProbe、CD Speed、PlexTool などで測定した結果を掲載されているホームページなども見ました。 表現が数値ですので分かりにくくて申し訳ございません。品質的に大丈夫か、速度と結果の違いなどご意見頂けますと幸いです。 よろしくお願いします。

  • どのようにしたらA君に勝てるか

    A君とB君は、始めに中に何も入ってない、それぞれのプレイヤーのターンが来るたびに自動的にひとつ飴玉が入る筒を使って、あるゲームを行います。ターンが回ってきたプレイヤーは二つの選択肢があって、筒の中に入ってる全ての飴玉を取るか、何もとらずに筒を次の人にパスすることが出来ます。もし飴を取ったとしたら、そのプレイヤーは次のkターンの間、パスをしなくてはなりません。初めにn個の飴玉を取った人が勝ちです。 B君は先攻と後攻を自由に選ぶことが出来ます。B君は勝利するためにどちらの選択をすればいいでしょうか?B君はどのような戦略を使えばどんな場合でもA君に勝てるようになりますか?(最初にk=1のケースを考えてみると楽だと思います。)