「モンティ・ホール問題」をシミュレートする(Ruby)

rubyでモンティホール問題に挑戦 - Qiita
ここでいわゆる「モンティ・ホール問題」を Ruby でシミュレートしているのを目にして、自分なりにやってみたくなりました。

「モンティ・ホール問題」とはこういうものです。

三つの扉があり、その向こうのひとつにだけ当たりがあります。
 
挑戦者はまず三つの扉の中からひとつを選びます。
司会者(モンティ・ホール)は当たりの扉を知っています。そして二つあるハズレの扉のひとつを開けます。
挑戦者はそこで前に選んだ扉をもういちどそのまま選択してもよいし、閉まっている残りの二つのどちらかを選びなおしてもよいです。
 
さて、挑戦者はここで扉を替えた方がよいのか、そのままにした方がよいのか、それともいずれでも当たる確率は一緒なのか。
どうなのでしょうか?

 
先に答えを言っておくと、これは「扉を替えた方」が当たる確率は高くなるのです。扉を替えない場合、当たる確率は 1/3 で、扉を替えると 2/3 になります。
不思議ですか? ただ扉を開けただけなのに?


コードと結果。
monty_hall_problem.rb

N = 100_0000

#一回の試行
def trial(is_reselection)
  doors = [true, false, false]
  select_of_challenger = rand(3)
  select_of_monty = (select_of_challenger == 3) ? 2 : 3
  
  if is_reselection
    doors.delete_at(select_of_monty)
    reselect_of_challenger = select_of_challenger.zero? ? 1 : 0
    doors[reselect_of_challenger]
  else
    doors[select_of_challenger]
  end
end

#N回試行して確率の計算
def calc(is_reselection)
  co = 0
  N.times { co += 1 if trial(is_reselection) }
  co.to_f / N
end

#扉を替えない場合
puts calc(false)    #=>0.333056
#扉を替える場合
puts calc(true)     #=>0.666614

確かにそうなります。

説明が必要でしょう。まず、扉 0, 1, 2 があって、当たりは必ず扉 0 にあるとします。挑戦者は何も知らないので、この仮定で問題ありません。これが doors = [true, false, false] で表されます。
あと、モンティは最初に挑戦者の選んだ扉は開けられません。


あとはさほど問題はないと思います。