#rubyでモンティホール問題に挑戦
##環境
ruby 2.4.1
##概要
プログラミングのための確立統計という本を読んでいたらモンティホール問題の話が出てきました。なので組んでみます。
モンティホール問題って何?
3つの扉とヤギと車で構成されるゲームです。
詳しくはここから
ソースコード
今回作成したソースコードを置いておきます。
試行回数は10000に設定してあります。
モンティホールプログラム
# 新たにモンティホール問題をセットするメソッド
def set_monty_hall_problem
monty_hall_problem = Array.new(3).map{|t| "Goat" }
correct_door_num = rand 3
monty_hall_problem[correct_door_num] = "Car"
return monty_hall_problem, correct_door_num
end
# その扉が正解かどうかを返却するメソッド
def correct_door? correct_door_num, open_door_num
correct_door_num == open_door_num
end
# 扉を開示するメソッド
def open_goat_door correct_door_num, open_door_num
goat_door_num =
if correct_door? correct_door_num, open_door_num
# 正解の場合、不正解のドアをどちらか開示
[*(0..2)].select{|t| t != open_door_num}.sample
else
# 不正解の場合、もう片方の不正解のドアを開く
[*(0..2)].select{|t| t != correct_door_num && t != open_door_num}[0]
end
end
# 確率に変換してくれるメソッド
def change_probability sum, occurrence_num
probability = (occurrence_num.to_f / sum.to_f) * 100
end
# モンティホール問題をプレイするメソッド
def play_monty_hall_problem trials_num
not_change_door_count = 0
trials_num.times do
# モンティホール問題と正解の扉番号を取得
monty_hall_problem, correct_door_num = set_monty_hall_problem
# 開けるドアをランダムに選択する
open_door_num = rand 3
# ヤギがいるドアの番号を取得
goat_door_num = open_goat_door correct_door_num, open_door_num
# 扉を変更しない場合
not_change_door_count += 1 if correct_door? correct_door_num, open_door_num
end
not_change_door_probability = change_probability trials_num, not_change_door_count
change_door_probability = 100 - not_change_door_probability
puts "扉を変更しないで車が当たった確率:#{not_change_door_probability}%"
puts "扉を変更して車が当たった確率:#{change_door_probability}%"
end
play_monty_hall_problem 10000
###結果
上記のソースコードを実行した結果を下記に記します。
結果
扉を変更しないで車が当たった確率:33.33%
扉を変更して車が当たった確率:66.67%
それぞれの理論値は、
扉を変更しないで車が当たった場合が1/3
扉を変更して車が当たった場合が2/3
なので、近い値になっている事がわかるかと思います。
本を読むだけじゃ手に入れられない実感を得られたので今後もこのように検証していきたいと思います。