ギャンブルのゲームで「クラップス」というのがあるそうで、カジノではとても盛り上がるらしいです。T_NAKA さんのブログ(参照)でこの「クラップス」のシミュレーションをやってあったのを拝見して、おもしろそうなので自分も Ruby でやってみました。T_NAKA さんは Python でコーディングしておられます。
def round n = shoot return true if n == 7 or n == 11 return false if n == 2 or n == 3 or n == 12 loop do m = shoot return false if m == 7 return true if m == n end end def shoot r = Random.new r.rand(6) + 1 + r.rand(6) + 1 end counter = 0 100_0000.times {counter += 1 if round} puts counter / 100_0000.0
100万回の試行で、T_NAKAさんとは反対に投げ手(シューター)の勝つ確率を求めてみました。結果は以下です。
0.492831 real 0m36.418s user 0m26.460s sys 0m9.960s
実時間で36秒ほどかかっています。確率が 0.492831 とシミュレートされたので、微妙に胴元が儲かるようになっているのがわかります。胴元が儲かるのは当然とはいえ、上手く設定されたゲームですね。
この「クラップス」は、サイコロの目が確率的に均等にならなくても(つまり不正なサイコロでも)問題なく遊べるように工夫されているそうです。それもやってみました。上の shoot
メソッド(サイコロを振るメソッド)を変えて、一方のサイコロについて 6 を多少出やすくしてみます。
def shoot r = Random.new d1 = r.rand(6) + 1 d2 = r.rand(6) + 1 d2 = 6 if d2 < 6 and r.rand < 0.1 d1 + d2 end
実行結果は 0.49357 となり、それほどのちがいは見られません。ほぼ誤差の範囲なのではないでしょうか。すごいですね、これは。