• 締切済み

モンテカルロシミュレーションのプログラム

ブラックジャックのプログラムについて困っています。プレイヤーは1対1とし2人とも戦略は16以下はもう1枚引き、17以上になったら引くのをやめるものとし、何回も何回も試合を自動で繰り返すモンテカルロシミュレーションを作ることは出来ますか?3万回以上の試合を目標としています。 簡単なソースでもよろしいので教えてください。(勝率を表示することが可能ならお願いします。) よろしくお願いします。

みんなの回答

  • yama5140
  • ベストアンサー率54% (136/250)
回答No.4

(「ブラックジャック」をしたことないので、的はずれになるかも・・) #1補>乱数を発生させて #2補>プログラミングについて詳しくありませんのでrandで rand で「どのように」4組のエースからキングまでを作ろうと考えていますか。 もし思いついていないとしたら、1例として   http://okwave.jp/qa/q6382508.html の質問者のソースが参考になるかと。 ここでは、0-19の数字を重複無く作成し、シャッフルしています。 今回も、エースは4枚、・・キングも4枚と過不足なく作成し、《並び》を「乱数で管理」する必要があることから、このアルゴリズムが参考になるかと・・。 そのプログラム例    for( i = 0; i < ( 13 * 4 ); i++ ){ // 52ケ整列     iVal = ( i % 13 ) + 1; // 「エース」から「キング」まで( 1 - 13 )     if( iVal > 10 ) iVal = 10; // 絵札は、10 点?     iCardVal[ i ] = iVal;    }    for( i = ( 13 * 4 - 1 ); i > 1; i-- ){ // シャッフル     iBasyo = rand() % ( i + 1 );     iVal = iCardVal[ i ];     iCardVal[ i ] = iCardVal[ iBasyo ];     iCardVal[ iBasyo ] = iVal;    } これで、1から9までの数字が各4ケ、10が16ケの計52ケがランダムに入った配列ができます。 #2補>自動でカードを16以下はもう1枚引き、17以上になったら引くのをやめるという条件文がわからず、 ~まで繰り返す、というのは、while 文が適していると思います。     while( iA < 17 ){      iA += iCardVal[ nn ];      nn++;     }     while( iB < 17 ){      iB += iCardVal[ nn ];      nn++;     } なお、1(エース)を、手持ち点に応じて 11 点にしたり、1 点のままにする必要がある?ならば、 その判断をする関数を用意し、     iA += AceCard( iA, iCardVal[ nn ] ); とすればいいと思います。 ちなみに、関数は、     int AceCard( int iPoint, int iVal )     {      if( 1 == iVal ){ // エースカード        if( iPoint < 11 ) return( 11 );      }      return( iVal );     } になろうかと。 >簡単なソースでもよろしいので教えてください。  あとは、超簡単な部分を組み合わせるだけ・・。  (・シャッフル)   ・はじめの2枚の配布  (・16点以下はもう1枚引き、17点以上になったら引くのをやめる)   ・22点以上になった場合の処理   ・勝ち負け判定   ・勝ち負けカウント   ・3万回ループ   ・結果出力 ★なお、1ゲームあたり配られた枚数頻度(母数3万)を求めるのも、いいかも。  11枚が最大かなぁ?

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

これでは条件が足りなさすぎ. ブラックジャックのルールそのものに関してもたとえば「A, 6」のときどうするのかという問題があるし, もっと大きく見ると ・デッキを何セット用意するのか (カジノでは 6セットとか 8セットとか使うこともある) ・いつ次のデッキに変えるのか (6セットとか 8セットとか用意しても, それをすべて使うわけじゃない) などが指定されていない.

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

1回分はできるのですか? それをループさせるだけですが。 標準関数のrandは統計学的な特性がよくないので、乱数発生器は別なものを使った方がよいでしょう。 > 何回も何回も試合を自動で繰り返すモンテカルロシミュレーションを作ることは出来ますか? できるから、シミュレーションとして成立つのですが。

konkons001
質問者

補足

自動でカードを16以下はもう1枚引き、17以上になったら引くのをやめるという条件文がわからず、まだ1回も回せておりません。また、プログラミングについて詳しくありませんのでrandで作ろうと考えております。少しでもよろしいのでヒントをください。

回答No.1

これのどこがわからんのですか? カードデッキがきれいにシャフルされれば、あとは乱数の絡む部分はないんだから。 要は「ソースくれ」ってこと?

konkons001
質問者

補足

乱数を発生させて何回も試行するようにするにはどういうソースになりますか?

関連するQ&A