蒙提霍爾問題-三門遊戲(Monty Hall Problem)

什麼是三門遊戲?

假設目前有三道門在你的眼前,其中兩道門後放著山羊,一道門後放著一台全新汽車,你能夠選擇其中一道門,在你選擇後,主持人將會打開其中一扇背後是山羊的門,這時你將有個選擇權,決定是否要更換原本選擇的門,轉選擇剩下的那道門,到底要換? 還是不換呢?

換? 還是不換?

選擇獎項後冒出了一個更換選項的選擇權,在現在的電視節目中也常看到類似的橋段。

而根據維基百科提供的資訊,類似的問題最早出現在1889年約瑟夫·貝特朗所著的Calcul des probabilités一書中。在這本書中,這條問題被稱為「貝特朗箱子悖論」(Bertrand's Box Paradox),在講三門問題前,先來看看甚麼是貝特朗箱子悖論

貝特朗箱子悖論(Bertrand's Box Paradox)

貝特朗箱子悖論的情境是這樣的,目前有三個箱子,箱子中分別裝著

  1. 兩枚銀幣
  2. 一枚金幣和一枚銀幣
  3. 倆枚金幣

請問,當選擇了一個箱子,抽到一枚金幣後,下一枚還是金幣的機率有多少? **直接講答案,是2/3,約當於66.7%**。

答案乍聽之下是違反直覺的,如果第一枚要抽到金幣作為條件,那只剩了第二跟第三個箱子可以當選項,而選第一枚抽到金幣的話,第二種情境會是銀幣,第三種則會是金幣,因此在下意識會覺得,機率是1/2,即50%。

以下算式來自維基百科,根據題目設定的條件,要求的是在第一枚是金幣後,第二枚也是金幣的機率,數學表達如下

$$P(GG|see \ gold)$$

根據貝氏定理

$$ P(A|B) = \frac{P(A)P(B|A)}{P(B)}$$

代到題目情境中

$$ P(GG|see \ gold) = \frac{P(GG)P(see \ gold|GG)}{P(see \ gold)}$$

其中$P(see \ gold)$為第一枚抽到金幣的機率,以題目設定的情境來看,三個箱子第一枚抽到金幣的機率分別為

$$ P(see \ gold | SS)=0, \ P(see \ gold | GG)=1, \ P(see \ gold |GS)=0.5$$

而箱子被選擇的機率是均等的,意即

$$ P(see \ gold) = \frac{1}{3}[P(see \ gold | SS)+P(see \ gold | GG)+P(see \ gold |GS)]= 0.5$$

算式可以寫作

$$P(GG|see \ gold) = \frac{P(GG)P(see \ gold|GG)}{P(see \ gold)}= \frac{\frac{1}{3}\times1}{0.5}= 0.667 $$

得出了結果確實是為2/3。


三門遊戲的結論

接著把畫面拉回到文章的起頭,當有這樣的選擇權存在時,到底該換還是不換? 結論就是,要換

再來回顧一下三門遊戲的條件設定

  • 在三道門中選一扇門
  • 選擇之後,主持人打開一扇後面是羊的門
  • 參加者能選擇要不要更換原有的選擇

tricky的地方就在於題目設定的條件,主持人一定會打開一扇後面為羊的門,以窮舉的方式最快理解

假設汽車在1號門後

如果參加者選擇1號門,主持人開啟2號或3號任一道門,則更換選擇必定輸。 如果參加者選擇2號門,主持人只能開啟3號門,則更換選擇必定贏。 如果參加者選擇3號門,主持人只能開啟2號門,則更換選擇必定贏

數學表達如下

三扇門被選擇的機率是均等的

$$ P(D1) = P(D1) = P(D1) = \frac{1}{3}$$

而獲勝的機率為

$$P(Win) = P(D1) \times P(Win|D1)+P(D2) \times P(Win|D2)+P(D3) \times P(Win|D3)$$

$$=0 \times \frac{1}{3} + 1 \times \frac{1}{3} + 1 \times \frac{1}{3} = \frac{2}{3}$$

得到結果為2/3。 在最一開始的情境假設,下意識會覺得只剩兩扇門可選,獲勝機率應為各半,但和上一節中的情境類似,題目的假設都幫忙排除了參加者失敗的機率,在上個情境中,直接假設了第一枚選擇到金幣的情況,在三門遊戲中,主持人將直接把後面為山羊的門打開。

最直觀的解釋還是窮舉,維基百科中提供了不少的思考模式來理解,可供參考。


蒙提霍爾問題-Python程式碼

利用Python將問題的情境模擬出來,試行多次後,獲勝的機率將趨近於三分之二,一起複製下來執行看看吧!

import random

doors = ['Goat', 'Car', 'Goat']

n = 1000
win = 0
lose = 0
for _ in range(n):
    
    ## ------------------------- ##
    ##  shuffle and random pick  ##
    ## ------------------------- ##
    random.shuffle(doors)
    first_choice = random.randrange(3)

    ## -------------------------------- ##
    ##  open a door with a goat behind  ##
    ## -------------------------------- ##
    for idx, gift in enumerate(doors):
        if idx != first_choice and gift == 'Goat':
            open_door = idx        
    
    ## ---------------------------- ##
    ##  change the original choice  ##
    ## ---------------------------- ##
    choices = [0, 1, 2]
    choices.remove(first_choice)
    choices.remove(open_door)

    second_choice = choices[0]
    
    ## -------- ##
    ##  result  ##
    ## -------- ##
    if doors[second_choice] == 'Car':
        win += 1
    else:
        lose += 1
        
print(f'Win:{win}, Lose:{lose}')

參考資料

蒙提霍爾問題

Bertrand's box paradox

貝氏定理

Tags:
# python
# math
# probability