Mae向きなブログ

Mae向きな日記のブログ版。ようやくこちらに移行してきました。

モンティ・ホール問題(2)

はてな民に確率の問題を出してみよう」の問1を読んだとき,同様の問題を以前,数学の先生から出題されたことを思い出しました。以下は,理屈が分からなかったので,Rubyでシミュレーションを行ったものです。シミュレーションの結果を見て,なんか狐につままれたような感じになったのを今でも覚えています。

問2の地震が来るバージョンは,初めて見る問題でした。問1も地震ではなく,自信を持って理解できているとは言えない段階で,ましてや問2は…という感じなので,シミュレーションを行ってみました。

monty_hall2.rb

#!/usr/bin/ruby
LOOP_TIMES = 1000000

t = Time.now
srand(t.sec ^ t.usec ^ Process.pid)

unchanged = 0                   # 最後まで選択を変えない
changed = 0                     # 途中で選択を変更する
invalid = 0                     # ゲームが無効になった回数

LOOP_TIMES.times do             
  hit = rand(3)                 # 当たりくじ
  first_ans = rand(3)           # Playerの1回目の選択
  earthquake = rand(3)          # 地震によって開くドア
  if hit == earthquake || first_ans == earthquake
    invalid += 1
    next
  end
  second_ans = nil              # Playerの2回目の選択
  loop do
    second_ans = rand(3)
    break if earthquake != second_ans && first_ans != second_ans
  end
  unchanged += 1 if first_ans == hit
  changed += 1 if second_ans == hit
end

puts "当たる確率…"
puts "最後まで選択を変更しない場合 : #{unchanged.to_f/(LOOP_TIMES - invalid)}"
puts "途中で選択を変更した場合   : #{changed.to_f/(LOOP_TIMES - invalid)}"

シミュレーション結果

当たる確率…
最後まで選択を変更しない場合 : 0.499274842545269
途中で選択を変更した場合   : 0.500725157454731

うぅ〜ん。確かに【回答編】はてな民に確率の問題を出してみようにあるように,1/2ですね。確率は難しい…。