Mae向きなブログ

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

モンティ・ホール問題

モンティ・ホール問題を数学の先生から聞いたのですが、本当に不思議な問題です。よく分からなかったので、シミュレーションをしてみました。
試行回数は100000回です。

#!/usr/bin/ruby
# -*- coding: utf-8 -*-
$KCODE = 'UTF8'
LOOP_TIMES = 1000000

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

unchanged = 0                   # 最後まで選択を変えない
changed = 0                     # 途中で選択を変更する

LOOP_TIMES.times do             
  hit = rand(3)                 # 当たりくじ
  first_ans = rand(3)           # Playerの1回目の選択
  remove = nil                  # 取り除く箱を決定
  loop do                        
    remove = rand(3)
    break if hit != remove && first_ans != remove
  end                           
  second_ans = nil              # Playerの2回目の選択
  loop do
    second_ans = rand(3)
    break if remove != 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}"
puts "途中で選択を変更した場合   : #{changed.to_f/LOOP_TIMES}"

実行結果

mmasa@ubuntu:~/work/ruby$ ./monty_hall.rb
当たる確率…
最後まで選択を変更しない場合 : 0.334139
途中で選択を変更した場合   : 0.665861

確かに第2の選択では当たる確率が2/3になっています…。