- 締切済み
モンテカルロシミュレーションのプログラム
ブラックジャックのプログラムについて困っています。プレイヤーは1対1とし2人とも戦略は16以下はもう1枚引き、17以上になったら引くのをやめるものとし、何回も何回も試合を自動で繰り返すモンテカルロシミュレーションを作ることは出来ますか?3万回以上の試合を目標としています。 簡単なソースでもよろしいので教えてください。(勝率を表示することが可能ならお願いします。) よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- yama5140
- ベストアンサー率54% (136/250)
(「ブラックジャック」をしたことないので、的はずれになるかも・・) #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)
これでは条件が足りなさすぎ. ブラックジャックのルールそのものに関してもたとえば「A, 6」のときどうするのかという問題があるし, もっと大きく見ると ・デッキを何セット用意するのか (カジノでは 6セットとか 8セットとか使うこともある) ・いつ次のデッキに変えるのか (6セットとか 8セットとか用意しても, それをすべて使うわけじゃない) などが指定されていない.
- kmee
- ベストアンサー率55% (1857/3366)
1回分はできるのですか? それをループさせるだけですが。 標準関数のrandは統計学的な特性がよくないので、乱数発生器は別なものを使った方がよいでしょう。 > 何回も何回も試合を自動で繰り返すモンテカルロシミュレーションを作ることは出来ますか? できるから、シミュレーションとして成立つのですが。
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
これのどこがわからんのですか? カードデッキがきれいにシャフルされれば、あとは乱数の絡む部分はないんだから。 要は「ソースくれ」ってこと?
補足
乱数を発生させて何回も試行するようにするにはどういうソースになりますか?
補足
自動でカードを16以下はもう1枚引き、17以上になったら引くのをやめるという条件文がわからず、まだ1回も回せておりません。また、プログラミングについて詳しくありませんのでrandで作ろうと考えております。少しでもよろしいのでヒントをください。