カジノゲーム「クラップス」のシミュレーション(Ruby)

ギャンブルのゲームで「クラップス」というのがあるそうで、カジノではとても盛り上がるらしいです。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 となり、それほどのちがいは見られません。ほぼ誤差の範囲なのではないでしょうか。すごいですね、これは。