• 締切済み

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

ブラックジャックのプログラムについて困っています。プレイヤーは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

  • モンテカルロシミュレーションのプログラムについて

    モンテカルロシミュレーションを用いたタンパク質と低分子の結合実験を行えるプログラム(使用言語:FORTRAN77)を作ろうと考えています。 結合実験の目的はタンパク質上で低分子が結合しやすい部分をさがすことです。 タンパク質上のそれぞれの部分に乱数を振り分けて確率的な試行(低分子をタンパク質に結合させる操作)を何回も繰り返すことで結合しやすい部分を見つけ出そうと考えています。 しかしプログラミングを本格的に始めてまもないということもあり、プログラムを作るための糸口がいま一つ見つかりません。 (例えばタンパク質上の各部分での乱数のふりかた、パソコンによる操作でタンパク質と低分子を結合できるようなプログラムの書き方など) プログラム完成にいたるまでの手順、方法等についてのアドバイスを頂けませんか?

  • プログラミングに詳しい方お願いします

    趣味でロボカップ2Dシミュレーションリーグというものをやっていて、3対3対の試合を想定してプログラムを作っていますが、プレイヤー1をゴール前に配置してゴールキーパーにしたいのですが、配置するまではよかったのですが、出来れば仲間がほとんどのボールをカットし、ある程度近い位置まできたらプレイヤー1のキーパーがボールを100でけるようにプログラムを作りたいのですが、上手くいきません。詳しい方、お願いします。 プログラムは『ことだま on Squeak』を用いたブロックプログラムというものです。

  • モンテカルロシュミレーション

    コンピューターによってこのシュミレーションを行う場合、 πの近似値の精度を高める為にはどのようなことが重要なのですか?

  • モンテカルロシミュレーションについて

    シミュレーション初心者なのですが,モンテカルロシミュレーションを用いて希薄気体中の粒子の放出分布の時間変化を見たいと考えています. direct simulation monte carloに関する本を見てるのですが,どうも時間要素が含まれていないようなのですが,時間変化を考慮したモデルとするにはどうすればよいのでしょうか? よろしくお願いします.

  • C++プログラムでのおかしな挙動

    初めまして。 自力で解決しようと試みましたが、どうしても無理なのでここでお聞きしようと思い、質問させて貰います。 Visual C++の環境にてモンテカルロシミュレーションでの同期加算処理のプログラムを書いた所、1.#INF00と値が返ってくる場合があります。 配列がとても大きくなる(tmp[1000][360]など)ので、new関数にてメモリ領域を確保しています。 同期加算計算を300回以上行った時に1.#INF00という値がちらほらと返ってくるのです。 これは処理の量と関係あるように思えますが、解決する方法はあるのでしょうか。 ちなみに for( i=0; i<n; i++ ){ for( j=0; j<TIME; j++ ){ out[i] = out[i] + tmp[j][i]; } out[i] = out[i] / TIME; } ※TIME = 1000、n = 360 という計算です。 質問内容がわかりにくくてすいませんが、急ぎなのでよろしくお願い致します。

  • こんなプログラムはありますか?

    2人のプレーヤがタバスコをピザに交互にふりかけます。 タバスコを振りかける回数はあらかじめ与えられており,最後にタバスコをピザにかけた人がピザを食べないといけません. パスはできません. タバスコを振りかける合計回数と,プレーヤが1 回に振りかけることができる最大の回数をコンピュータに入力した後,ゲームを開始する。 といった感じのプログラムなのですが・・・ 見本などあれば参考にしたいのでお願いします。 【実行例】 最後にタバスコをかけた人がピザを食べるルールです。 タバスコをかけられる回数は? 20回です。 1回にタバスコをかけられる最大の回数は? 4回です。 自分はタバスコを2回かけます。 残りは18回です。 何回かけますか? 3回かけます。 残りは15回です。 ・ ・ ・ 自分はタバスコを1回かけます。 残りは0回です。 あなたの負けです。 残さず食べてくださいね!

  • EXCELで質問!自信がある人おねがい!!!

    たとえばサッカーでチームが6つぐらいあるとして総当りをし、すべてのチームが二回づつ行うように前期と後期に分けて試合をしました。その結果の勝率を出した表を作成しました。その中で前期、後期のどちらかの勝率が50%以上のチームに「★」を表示する関数を入れたいのですがどうすればいいでしょうか?不器用な説明かもしれませんが教えてください。お願いします!!

  • セリーグの最終順位の決め方

    セリーグの最終順位の決め方 は、(1)勝率、(2)勝ち数、(3)当該球団間の対戦勝率・・・だそうです (1)が一緒で(2)が違うということが現実的に起こりうるのかしらと思い、 どういうケースがあるのか考えてみました つまり、引き分けの分が減った場合ですね で、全144試合で、勝ち数をx、引き分け数をyとすると、xは2リーグ分裂後の最低勝率は0.238だそうで144試合の場合34勝以上となり、最高勝率は0.737だそうで105勝以下としましょう。(33<x<106) 最近は延長が12回までとなって引き分けが昔より減っておりここ10年で最多の引き分けは9となっているので大目に見て15以下としましょう(y<16)。このように考えて144試合でx勝したチームと引き分けyで144-y試合でx'勝したチームが同率になるように計算していました。たとえば引き分け8のときは136試合となり、34,51,68,86勝のとき、144試合で36,54,72,90勝したチームと同じ勝率になるようです。ここで、はたと気づきました。比べるチームも引き分けがあるわけで、そのケースも考えないといけないことを・・・。そこで断念してしまいました。 どなたか数学好きの暇な方、同じ勝率で勝ち数が違うケースについて計算して教えてもらえませんか? まったくわがままなお願いで恐縮です。

  • スローボールは打たれるのか?

    日付は忘れてしまったんですが、何日か前に巨人対阪神の試合でクルーンの押し出しサヨナラがありましたよね? フルカウントからファールで粘られて結局フォアボールになっちゃった、ってやつです。 あれを見て思ったんですが、もしあの場面でクルーンが球速80km/hぐらいのスローボールを投げたらどうなっていたんでしょう? 150km/h後半のボールを何度も投げられてから急に草野球並みのボールを投げられたら誰だってタイミングが崩れると思うんですが……。 クルーンのあの場面に限らず、プロ野球を見ていると「ここでスローボール投げればいいのに……」 って思うことがよくあります。 何度も使えるような戦略ではないでしょうけど、20~30試合に一回ぐらいなら確実に打ち取れる戦略だと思うんです。

  • スプラトゥーン2 ナワバリで勝てない

    ニンテンドースイッチのスプラトゥーン2を1週間ほど前から始めました。 ナワバリバトルしかしていませんが、なかなか勝てずに困っています。 今のランクは25で、武器は主にデュアルスイーパーカスタムを使っています。 アプリで50試合中の勝率を見ると、3日前までは勝った試合の方が多かった(勝ち30対負け20ぐらい)だったのに、ここ数日で負け続け、現在は勝ち18対負け32になってしまいました。 私の塗りは50試合の平均が850ほどで、キルは3.8(0.8)でスペシャル使用回数は平均2です。 めちゃくちゃ下手なわけではないと思いますが、上手くもないと自分では思っています。 デスは毎試合3回ぐらいはしています。 もちろんたまに全くデスされないときや、逆に多くデスされてしまうときもありますが。 開幕はまずエリアの真ん中を攻めていってます。 その後、死んだときなどに自陣を塗っています。 なるべく死なないように立ち回っているつもりですが、たまに敵に挟まれたりして負けるときがあるので、まだ立ち回りが甘いのだと思ってます。 ちなみにエイム練習も数日前から始めました。 なぜ勝てないのかが自分ではあまりよく分からず悔しいです。 やり始めて1週間では勝てないのは当然でしょうか? なにかアドバイスを頂けると嬉しいです。

専門家に質問してみよう