你參加了一個益智節目,歷經千辛萬苦終於來到最後一個環節,即將有機會把大獎帶回家。
眼前有三扇門,主持人告訴你,其中一扇門後面是一台車,另外兩扇門後面是山羊。
主持人請你先選一扇門。你選好了 — — 比如說選了第 1 扇。
接著,主持人打開剩下兩扇門的其中一扇— — 裡面是隻山羊。
這時,他丟出一個靈魂拷問:
「你要不要換門?」
你會換嗎?
(當然要排除掉主持人故意坑你的狀況,這個就不在討論之列)
這時,以往的直覺會告訴我們:「剩下兩扇門,機率不就是 50 / 50 嗎?換不換都一樣吧?有什麼好質疑的?」(那就堅持原本的直覺,不換!)
以上問題叫做三門問題,在上Python網課時看到的,覺得很有趣...天哪!怎麼會有人想要研究這個?
我想說,啊就50 / 50,不是嗎?拿去問家人,他也不假思索的說,機率是50 / 50,如果是他他不要換門。
沒想到,我的直覺是大錯特錯。(若想知道正確的機率,再繼續看下去。)
其實,換門之後贏的機率是 2/3;若不換只有 1/3。
這不是運氣,是數學。而且這個問題可以延伸成「N門問題」。
初始機率:
你第一次選門的時候,選中車子的機率是多少?
👉 是 1/3,因為三扇門只有一扇是車。
那你沒選到車的機率呢?
👉 是 2/3,因為其他兩扇門有兩扇,總機率加起來就是 2/3。
主持人「幫你」排除一扇門後:
這時,場上只剩你選的門,和另一扇沒被打開的門。看起來像 50/50?
但其實是這樣:
如果你原本選對(1/3 機率),換門就會選錯。
如果你原本選錯(2/3 機率),換門就會選對!
這表示,只要你一開始沒選中車(機率是 2/3),換門就會讓你贏。
結論:該換嗎?
該,請立刻換門,別被你的腦袋騙了。
然後,老師請我們練習寫一隻程式來驗證這個2/3的機率是對的,BUT我竟然做錯作業,做成了一個可以讓使用者輸入要不要換門的三門問題遊戲🤣
import random
items = ['win','lose','lose']
random.shuffle(items)
unchosen_doors = []
lose_doors = []
for i in range(len(items)):
unchosen_doors.append(items[i])
user = input(f'這裡有三扇門,從左到右是A、B、C,你要選哪一扇:')
if user not in ['A', 'B', 'C']:
print("輸入錯誤,請輸入 A、B 或 C")
exit()
if user == 'A':
user_choice = unchosen_doors.pop(0)
elif user == 'B':
user_choice = unchosen_doors.pop(1)
elif user == 'C':
user_choice = unchosen_doors.pop(2)
for i in unchosen_doors:
if i == 'lose':
lose_doors.append(i)
host_choice = random.choice(lose_doors)
print(f'主持人打開一扇門是{host_choice},要換嗎')
unchosen_doors.remove(host_choice)
answer = input(f"要換成另一扇門請答T,不要請答F:").upper()
if answer == "F":
answer = user_choice
if user_choice == 'win':
print(f'你原本選的門是{user_choice},恭喜中獎💜')
else:
print(f'你原本選的門是{user_choice}, 可惜沒中獎🤣')
else:
answer = unchosen_doors[0]
if answer == 'win':
print(f'你改選的門是{answer}, 恭喜中獎💜')
else:
print(f'你改選的門是{answer}, 你原本選的是{user_choice}, 可惜沒中獎🤣')
我先做出一個清單存三種可能性(1個贏、2個輸),然後用random.shuffle洗牌;再來用兩個空的list分別放unchosen_doors跟lose_doors。
其實最一開始還用了一個空清單叫做win_door,那時候的想法是,因為主持人不可以打開有獎品的門,但是萬一玩家第一扇門就選中有獎品的門怎麼辦?那我就做一個if判斷式,假如玩家選中贏的門就存進去win_door清單。
但後來發現用不到win_doors,因為主持人開了一扇門,最後unchosen_doors裡面一定只剩下一扇門,所以我只要用index抓出unchosen_doors[0]就好了。
然後中間那一段,是比較困擾的地方,因為我想要用.pop()把玩家選到的門刪掉。
但我最後寫好程式丟給ChatGPT請它幫我檢查時,它說我不可以用.pop(),會導致後面索引錯位:
不得不說,寫程式真的是ChatGPT的強項,而且讓我們學習更有效率,以前學程式應該就是看書自己摸索吧,現在我還蠻常問它一些邏輯問題,真正的實作還是要自己去測試才對,問邏輯其實蠻好用的!(ex. 請跟我解釋為什麼這段程式碼要這樣寫、如果我用XX方法寫會有問題嗎?)
總之,做完這個三門問題遊戲,才發現老師要我們練習的是寫出算機率的程式🤣(而且是算必定會換門的機率)
不過這個誤打誤撞的過程還是練習到了很多,也認知到了很多時候,我們的直覺其實是不可靠的,下次如果有機會上這種益智節目,也許就更應該知道怎麼選擇了。