モンティ・ホール問題をシミュレーションしてみた
モンティ・ホール問題というのがあります。
三つのドアにクルマ、ヤギ、ヤギがランダムに入っている。
プレイヤーは一つのドアを選ぶ。
司会者は残りのドアのうちヤギのいるドアを一つを開ける。
司会者は「変更しますか」と訊く。
プレイヤーは変更すべきか。
モンティ・ホールという司会者のテレビ番組におけるゲームについて、このような問題がありました。
一見、確率は二分の一なので「どちらでもいい」が答えになりそうです。
しかし、「アスク・マリリン」というコラムで、マリリン・ボス・サバントという女性コラムニストが「変更すべき」と回答して、大論争を巻き起こしたそうです。
実験すれば済む話だと思いますが、とにかく著名な数学者も登場して相当、揉めたそうです。
これをPythonで実験してみました。
import random
def main():
ct = {"goat":0, "car":0}
number_all = 10000
for i in range(number_all):
result = once()
ct[result] += 1
print(ct)
def once():
doors = ["car", "goat", "goat"]
random.shuffle(doors)
player_choice = random.randint(0, 2)
if doors[player_choice] == "goat":
if player_choice == 0:
if doors[1] == "goat":
monty_choice = 1
else:
monty_choice = 2
elif player_choice == 1:
if doors[0] == "goat":
monty_choice = 0
else:
monty_choice = 2
else:
if doors[0] == "goat":
monty_choice = 0
else:
monty_choice = 1
else:
temps = [0, 1, 2]
temps.remove(player_choice)
random.shuffle(temps)
monty_choice = temps[0]
temps2 = [0, 1, 2]
temps2.remove(player_choice)
temps2.remove(monty_choice)
notopen_choice = temps2[0]
# 変更しない
# result=doors[player_choice]
# return result
# 変更する
result = doors[notopen_choice]
return result
if __name__ == "__main__":
main()
def main():
ct = {"goat":0, "car":0}
number_all = 10000
for i in range(number_all):
result = once()
ct[result] += 1
print(ct)
def once():
doors = ["car", "goat", "goat"]
random.shuffle(doors)
player_choice = random.randint(0, 2)
if doors[player_choice] == "goat":
if player_choice == 0:
if doors[1] == "goat":
monty_choice = 1
else:
monty_choice = 2
elif player_choice == 1:
if doors[0] == "goat":
monty_choice = 0
else:
monty_choice = 2
else:
if doors[0] == "goat":
monty_choice = 0
else:
monty_choice = 1
else:
temps = [0, 1, 2]
temps.remove(player_choice)
random.shuffle(temps)
monty_choice = temps[0]
temps2 = [0, 1, 2]
temps2.remove(player_choice)
temps2.remove(monty_choice)
notopen_choice = temps2[0]
# 変更しない
# result=doors[player_choice]
# return result
# 変更する
result = doors[notopen_choice]
return result
if __name__ == "__main__":
main()
結果
{'goat': 3271, 'car': 6729}
変更した場合、クルマが出てくる確率が3分の2になりました。
明らかに「変更すべき」が正解です。
[ 2023年11月27日 | カテゴリー: 小ネタ | タグ: 確率 ]
« Pythonでライブラリを使わず行列の積を求める方法 | デロンギのスイッチがおかしい »
コメントを残す