什麼是三門遊戲?
假設目前有三道門在你的眼前,其中兩道門後放著山羊,一道門後放著一台全新汽車,你能夠選擇其中一道門,在你選擇後,主持人將會打開其中一扇背後是山羊的門,這時你將有個選擇權,決定是否要更換原本選擇的門,轉選擇剩下的那道門,到底要換? 還是不換呢?
換? 還是不換?
選擇獎項後冒出了一個更換選項的選擇權,在現在的電視節目中也常看到類似的橋段。
而根據維基百科提供的資訊,類似的問題最早出現在1889年約瑟夫·貝特朗所著的Calcul des probabilités一書中。在這本書中,這條問題被稱為「貝特朗箱子悖論」(Bertrand's Box Paradox),在講三門問題前,先來看看甚麼是貝特朗箱子悖論
貝特朗箱子悖論(Bertrand's Box Paradox)
貝特朗箱子悖論的情境是這樣的,目前有三個箱子,箱子中分別裝著
- 兩枚銀幣
- 一枚金幣和一枚銀幣
- 倆枚金幣
請問,當選擇了一個箱子,抽到一枚金幣後,下一枚還是金幣的機率有多少? **直接講答案,是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}')