アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (4件)

(「ブラックジャック」をしたことないので、的はずれになるかも・・)



#1補>乱数を発生させて
#2補>プログラミングについて詳しくありませんのでrandで

rand で「どのように」4組のエースからキングまでを作ろうと考えていますか。
もし思いついていないとしたら、1例として

  http://oshiete.goo.ne.jp/qa/6382508.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枚が最大かなぁ?
    • good
    • 0

これでは条件が足りなさすぎ. ブラックジャックのルールそのものに関してもたとえば「A, 6」のときどうするのかという問題があるし, もっと大きく見ると


・デッキを何セット用意するのか (カジノでは 6セットとか 8セットとか使うこともある)
・いつ次のデッキに変えるのか (6セットとか 8セットとか用意しても, それをすべて使うわけじゃない)
などが指定されていない.
    • good
    • 0

1回分はできるのですか?


それをループさせるだけですが。

標準関数のrandは統計学的な特性がよくないので、乱数発生器は別なものを使った方がよいでしょう。


> 何回も何回も試合を自動で繰り返すモンテカルロシミュレーションを作ることは出来ますか?

できるから、シミュレーションとして成立つのですが。

この回答への補足

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

補足日時:2011/01/26 07:15
    • good
    • 0

これのどこがわからんのですか?


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

この回答への補足

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

補足日時:2011/01/26 06:11
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!