モンティ・ホール問題 Python
最近、youtubeで目にするパラドックスの一つ、モンティ・ホール問題をpythonで書いて検証してみた。wikipedia曰く、この問題はアメリカで大論争になったという。プログラムを組んで確認してみることにする。
モンティー・ホール問題を軽く説明する。
3つのドアのうち一つが当たり。
回答者は最初に一つのドアを選ぶ。
その後、残りのドアのうち、外れのドアが司会者によって開けられる。
回答者は、残りのドアに変更することができる。
さて、選び直した方が、当たりを引く可能性は大きいのか。
選びなおさない方がいいのか。
コード
import random # ドアの数 DOORS_NUMBER = 3 # ドアを作成 def makeDoors(number): if number <= 1: print("please input more than 1") doors = list(range(number)) correct = random.randrange(number) doors[correct] = "o" return doors if __name__ == "__main__": correct = 0 for i in range(10000):#試行回数 doors = makeDoors(DOORS_NUMBER) # 開けたいドアを指定する open_number = "" while(True): ## 開けたいドアを指定する場合 # open_number = input("which door will you open?\n") # 開けたいドアはランダムで決める open_number = random.randrange(DOORS_NUMBER) if DOORS_NUMBER > int(open_number): break # o:あたり x:ハズレ another_door = doors.index("o") final_answer = "" # 指定したドアが正解の場合 if doors[int(open_number)] == "o": while(True): another_door = random.randrange(DOORS_NUMBER) if another_door != int(open_number): break # y : 選びなおす, n : 選びなおさない final_answer = "y" if final_answer == "y": if doors[another_door] == "o": print("o/y") correct = correct +1 else: print("x/y") else: if doors[int(open_number)] == "o": print("o/n") correct = correct +1 else: print("x/n") # 正解数 print(correct) # 正解率 print(f'{correct/10000 * 100}%') ## 66%~68%に落ち着く。
ちなみに選びなおさないと32%~34%に落ち着く。
ドアの数がもっと多いと、分かりやすくなる。
最初に選んでないドアの方が多く、当たりは含まれやすいので、選び直した方が良いのだ。