iT邦幫忙

2025 iThome 鐵人賽

DAY 2
0
自我挑戰組

從零開始的AI學習之路:非本科轉職的30天挑戰記系列 第 2

D2 | 顛覆你的直覺:三門問題 Monty Hall Problem 的機率真相

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20250807/20177974uhPd1T3sIS.png
你參加了一個益智節目,歷經千辛萬苦終於來到最後一個環節,即將有機會把大獎帶回家。

眼前有三扇門,主持人告訴你,其中一扇門後面是一台車,另外兩扇門後面是山羊。

主持人請你先選一扇門。你選好了 — — 比如說選了第 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(),會導致後面索引錯位:
https://ithelp.ithome.com.tw/upload/images/20250807/20177974e8I5ciM1PC.png

不得不說,寫程式真的是ChatGPT的強項,而且讓我們學習更有效率,以前學程式應該就是看書自己摸索吧,現在我還蠻常問它一些邏輯問題,真正的實作還是要自己去測試才對,問邏輯其實蠻好用的!(ex. 請跟我解釋為什麼這段程式碼要這樣寫、如果我用XX方法寫會有問題嗎?)

總之,做完這個三門問題遊戲,才發現老師要我們練習的是寫出算機率的程式🤣(而且是算必定會換門的機率)
不過這個誤打誤撞的過程還是練習到了很多,也認知到了很多時候,我們的直覺其實是不可靠的,下次如果有機會上這種益智節目,也許就更應該知道怎麼選擇了。


上一篇
D1 | 我用 AI 幫我設計營養午餐!好吃、好笑又好瘦(?)
下一篇
D3 | 當好玩的數獨變燒腦的數獨Valid Sudoku(python解題心得)
系列文
從零開始的AI學習之路:非本科轉職的30天挑戰記30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言