ブラックジャックのシミュレーション
前にJTが行っている"Jminutes"というサービスについて書いたことがある。
このスマホ用アプリには、カードゲームのブラックジャックが付いていて、「コイン」と称するポイントを賭けるようになっている(このコインを使って懸賞に応募できる)。
周知のとおり、手札の数の合計が21を超えない範囲で、親のそれよりも大きければ勝ちというゲームである。2~10まではその数、J、Q、Kは10として数える。Aceは特殊で、1としても11としても使える。
また、手札がAceと10の値を持つカードの2枚のときはブラックジャックで通常の21よりも強い手である。
最初に2枚のカードが配られその様子によって、次のカードを要求するかどうか決める。次のカードは何枚でも要求できるが、21を超えたらその時点でBust(バレる)となって、負けで終了となる。
さて、このゲームで遊んでいて、次のカードを引くかどうかを機械的に決めるようにしたらどうだろうと、やってみた。
つまり目標とする点数を決めて、その値に達してなければカードを引き、そうでなければ引かないという戦略である。
Bustになるのはそれなりにショックなので、13というかなり低めの目標値を設定してやっても、そこそこ勝てる。それで気になったので、目標値をいくらにしたらもっとも勝率が高くなるのかシミュレーションしてみた。
本来なら、見えている札(自分の札と、ディーラーの札のうち最初の1枚)の状態で、次のカードの出現確率も変動するから、それも含めて考えるべきなのだろうけれど、実際のゲームでそういう確率計算ができるとは思えないので、単純に前述のとおり、目標値未満なら次のカードを引き、目標値に達していたらそこで勝負するという戦略で臨む。
シミュレーションは例によってExcel VBAを使ってプログラミングした。
そのソースリストはこちら。
親(Dealer)も同じ戦略でプレイすることにし、親の目標値は17に固定した。これは件のアプリでの親の挙動を観察した結果である。
さて、シミュレーションの結果だが、結論から言うと目標値を15にするのが最も勝率が高い。
目標値11~20について、それぞれ100,000回の試行を行ったときの結果。
この結果では、目標値12から13で勝率が下がり、14でまた上がっているけれど、こんな変曲点があるとは考えにくいから、試行に偏りがあったのだろうと考えて、目標値13から17までについて、1,000,000回の試行で再度シミュレーションを実行した。
目標値13のときの勝率が45.86%で、100,000回試行のときの45.51%よりだいぶ上がり、やはり目標値12より上になりそうである。
それにしても、目標値の違いによる勝率の差は僅かなようである。
原理的にBustが出ない目標値11のときと、おそらく最高勝率の目標値15のときで、勝率は3ポイントも違わない。
それと、目標値をどうとっても勝率は5割を超えない。
これは、親と子でゲームは非対称であることが原因である。つまり、子がBust(21超)となったとき、親は無条件に勝ちになるからである。
これではさすがにまずいということか、スマホアプリではブラックジャックで勝った場合はボーナスが付くようになっている(1000点ベットして、通常の勝ちは2000点のリターンのところ、ブラックジャックだと2500点)。
それでも期待値はマイナスになるけれど。
であるけれど、実際にゲームをすると、1日30回プレイできるのだけれど、今まで負け越したことはほとんどない。上のシミュレーションの結果では、もっと負けがこんでも良さそうなものだけれど、ディーラーの戦略あるいはカードのシャッフルのしかたが、子の勝率をあげるように調整されているのかもしれない。
シミュレーション・プログラムにミスがあったらごめんなさい。
気になる方は、ソースリストをご確認ください。
このスマホ用アプリには、カードゲームのブラックジャックが付いていて、「コイン」と称するポイントを賭けるようになっている(このコインを使って懸賞に応募できる)。
周知のとおり、手札の数の合計が21を超えない範囲で、親のそれよりも大きければ勝ちというゲームである。2~10まではその数、J、Q、Kは10として数える。Aceは特殊で、1としても11としても使える。
また、手札がAceと10の値を持つカードの2枚のときはブラックジャックで通常の21よりも強い手である。
最初に2枚のカードが配られその様子によって、次のカードを要求するかどうか決める。次のカードは何枚でも要求できるが、21を超えたらその時点でBust(バレる)となって、負けで終了となる。
さて、このゲームで遊んでいて、次のカードを引くかどうかを機械的に決めるようにしたらどうだろうと、やってみた。
つまり目標とする点数を決めて、その値に達してなければカードを引き、そうでなければ引かないという戦略である。
Bustになるのはそれなりにショックなので、13というかなり低めの目標値を設定してやっても、そこそこ勝てる。それで気になったので、目標値をいくらにしたらもっとも勝率が高くなるのかシミュレーションしてみた。
本来なら、見えている札(自分の札と、ディーラーの札のうち最初の1枚)の状態で、次のカードの出現確率も変動するから、それも含めて考えるべきなのだろうけれど、実際のゲームでそういう確率計算ができるとは思えないので、単純に前述のとおり、目標値未満なら次のカードを引き、目標値に達していたらそこで勝負するという戦略で臨む。
シミュレーションは例によってExcel VBAを使ってプログラミングした。
そのソースリストはこちら。
親(Dealer)も同じ戦略でプレイすることにし、親の目標値は17に固定した。これは件のアプリでの親の挙動を観察した結果である。
さて、シミュレーションの結果だが、結論から言うと目標値を15にするのが最も勝率が高い。
目標値11~20について、それぞれ100,000回の試行を行ったときの結果。
この結果では、目標値12から13で勝率が下がり、14でまた上がっているけれど、こんな変曲点があるとは考えにくいから、試行に偏りがあったのだろうと考えて、目標値13から17までについて、1,000,000回の試行で再度シミュレーションを実行した。
目標値13のときの勝率が45.86%で、100,000回試行のときの45.51%よりだいぶ上がり、やはり目標値12より上になりそうである。
試行回数が多ければ大数の法則が効いてくるわけだが、実際のところ、どのぐらいの試行をしたらよいのだろう。1,000,000回の試行でも、有効数字は3桁ぐらいしかなさそうに思う。
それにしても、目標値の違いによる勝率の差は僅かなようである。
原理的にBustが出ない目標値11のときと、おそらく最高勝率の目標値15のときで、勝率は3ポイントも違わない。
それと、目標値をどうとっても勝率は5割を超えない。
これは、親と子でゲームは非対称であることが原因である。つまり、子がBust(21超)となったとき、親は無条件に勝ちになるからである。
これではさすがにまずいということか、スマホアプリではブラックジャックで勝った場合はボーナスが付くようになっている(1000点ベットして、通常の勝ちは2000点のリターンのところ、ブラックジャックだと2500点)。
それでも期待値はマイナスになるけれど。
であるけれど、実際にゲームをすると、1日30回プレイできるのだけれど、今まで負け越したことはほとんどない。上のシミュレーションの結果では、もっと負けがこんでも良さそうなものだけれど、ディーラーの戦略あるいはカードのシャッフルのしかたが、子の勝率をあげるように調整されているのかもしれない。
シミュレーション・プログラムにミスがあったらごめんなさい。
気になる方は、ソースリストをご確認ください。
なお、このマクロ、一部の環境(Excel2016/Windows10)ではきちんと動かない場合があるようだ。
それについては明日報告する。