0%

三門問題(Monty Hall Problem)

三門問題,或蒙提霍爾問題是一個違反直覺的條件機率問題,本文將從不同角度切入,探討不同選擇的機率大小。

問題敘述

資料來源
影片網址
在 2008 年上映的美國電影《決勝21點》中,劇中主角班 (Ben Campbell)在非線性代數的課堂上與授課教授米奇(Mickey Rosa) 有一段精彩的對話:

米奇:「假設你正參加一個遊戲節目,你有機會從三扇不同的門裡選一扇,其中一扇門後面有一輛新車,另外兩扇門後面各有一頭山羊?你要選擇哪一扇門?」

班: 「一號門。」

米奇:「好!這時節目主持人,順便一提,他知道門後的秘密,他去打開另一扇門,比方說他開了三號門,後面是一頭山羊。這時節目主持人說:「班,你想要堅持選擇一號門,還是換成二號門?」現在問題是–改變選擇(換另一扇門)是否對你有利?」

班: 「是的」

米奇:「記住!主持人知道那輛車在哪裡,你怎麼知道他不是在耍你?……」

班: 「我並不介意,因為我的答案是基於統計學,……,當一開始他讓我選一扇門時,我有 33.3% 的機率是選對的,但當他開其中一扇門時,然後又讓我選時,此刻如果我選擇換一扇門,選對的機率是 66.7%,……。」

換句話說,假設你正在參加一個游戲節目,你被要求在三扇門中選擇一扇:其中一扇後面有一輛車;其餘兩扇後面則是山羊。你選擇了一道門,假設是一號門,然後知道門後面有什麼的主持人,開啟了另一扇後面有山羊的門,假設是三號門。他然後問你:「你想選擇二號門嗎?」轉換你的選擇對你來說是一種優勢嗎?


答案:換門贏得獎品的機率為$\frac{2}{3}$,不換門為$\frac{1}{3}$,因此應該選擇換門!

這個問題可以擴展成N門問題,也就是主持人在開了$N-2$道門以後,分析換門與不換門贏得汽車的機率。

條件機率:貝式定理

在條件機率中,以$P(A|B)$表示在B發生的條件下A發生的機率,其值:

我們還可以畫出以下樹狀圖做分析:

假設 $A$ 為得獎的情況,$A’$ 為不得獎的情況,$B$ 為換門的情況,$B’$ 為不換門的情況
如果要得獎會發生以下兩種狀況:

  1. 不換門得獎:$P(A|B’)=\frac{\frac{1}{6}}{\frac{1}{6}+\frac{1}{3}}=\frac{1}{3}\cong 0.33$
  2. 換門得獎:$P(A|B)=\frac{\frac{1}{3}}{\frac{1}{6}+\frac{1}{3}}=\frac{1}{3}\cong 0.66$

從貝式定律可以得到,換門的機率比較高!

窮舉法(列表觀察)

我們也可以透過列表得到相同的結論,在下表中假設「選中」為參與者第一次選中的門,「開門」則是主持人打開的有山羊的門,「換門」則是剩下的那個門

這邊可能會有一個疑惑(如果沒有那不要理我XD):
當我第一次選中有車的門時為什麼只有列一次,主持人不是可以選擇打開兩個有山羊的門其中一個,不應是兩種狀況?

只有一種是因為後面有車的門觀眾只會選到一次,不像山羊觀眾可以選兩次,並且主持人打開哪一道門實際是沒有影響,都視為同一種狀況!

新車 山羊 山羊 結果
選中 開門 換門 不換門贏
換門 選中 開門 換門贏
換門 開門 選中 換門贏

從上表可以清楚看出,換門之後贏的機會是$\frac{2}{3}$,不換門則是$\frac{1}{3}$。

直覺想法

錯誤想法-遲到法

有些人會問:當我從三道門選完之後,主持人打開了一扇門。這時候我請另外一個場外人來看現在的局面:兩扇門關閉,一扇門打開是山羊,那這時候這個局外人選中的機會不就是$\frac{1}{2}$?

這個推論其實是正確的,以一個局外人看到的情況與機率確實是$\frac{1}{2}$,但這樣的思考前提是錯誤的,因為這位局外人並沒有參與一開始三門的選擇!
條件機率有一個重要的概念,也就是一個事件的機率會隨著情境的不同(提供訊息的改變)而可能會有所改變,這就是一個很明顯的例子

幫助理解的思考方法

1990 年 9 月 9 日,瑪麗蓮‧沃斯‧薩萬特 (Marilyn vos Savant) 在《繽紛遊行》(Parade) 的「請問瑪麗蓮」專欄中,回答讀者提出的三門問題,沃斯‧薩萬特是金氏世界紀錄最高智商 228 的人,她認為選擇換的勝算比較大。為了說服讀者,她請大家想像有 1,000,000 扇門,她說:

你選擇 1 號門,而主持人知道門後有什麼,他總是避開有獎的那扇門,除了 777,777 號門外,把別的門都打開了。這時你會毫不猶豫地換到另一扇門,是吧?」

從N道門中選擇其中一道門中獎機率$\frac{1}{N}$,不中獎的機率為$\frac{N-1}{N}$,也就是說有$\frac{N-1}{N}$的機率汽車在另外$N-1$道門中。這時候主持人幫你一個大忙,他打開了其中沒有汽車的$N-2$道門,不就是幫助你剔除了不可能選中的情況,也就代表把$\frac{N-1}{N}$的中獎機率集中在剩下的那一扇門中!

因此可以得到結論:在$N$門問題中,假設主持人總共會打開$N-2$道門,那換門中獎的機率會是$\frac{N-1}{N}$,不換門中獎則是$\frac{1}{N}$

程式實作:以C++模擬

如果上面的東西都無法說服你,那就來寫一個程式模擬吧!寫程式最重要的就是要證明模擬是正確的,因此會印出若干組結果看看是否合理!
這個程式會亂數幫觀眾選一扇門(隨機選),與中獎的門(也是隨機選),接著主持人打開門後會剩下觀眾選的與一個還沒有被開的門

主持人打開N-2道門(剩2道門做選擇)

我們取$N=3$ 做例子(當然也可以隨意輸入),第一個3表示門的數量,接下來的100000表示模擬次數

印出前五次的模擬情況作觀察,這個程式在印出未中獎時,換門中獎的事件加一;反之,印出中獎時,不換門中獎的事件加一,模擬結果符合預期!

如果共有10道門,一樣符合預期,換門中獎機率落在$\frac{9}{10}$左右

主持人打開K道門(剩N-K道門做選擇)

如果給個變化題,主持人想說不要對觀眾那麼好,在未被觀眾選中的$N-1$ 道門中開啟K道後面有羊的門。我們知道會有$\frac{N-1}{N}$的機率會在不是觀眾選的另外$N-1$道門中,但在這$N-1$道門中因為打開了$K$道門,剩下$N-1-K$道門可以選擇,因此可以列出以下式子:

這就是換門中獎的機率!

我們可以將換門中獎的機率扣掉不換門中獎的機率:

已知$N-K\geq2$ 且$K\geq0$,因此無論開多少門(甚至不開),換門的中獎機率永不小於不換門的機率!

以上為設定9個門,主持人打開5道門,執行一百萬次的結果。
根據上面的公式,我們預期會有$\frac{8}{27}\cong 0.2963$的機率換了會中獎,符合模擬的結果

有a輛車,主持人開K道門

這就比較簡單了,原本只有1輛車,變成a輛車自然中獎的機率就會變a倍,套用上面的公式,換門中獎機率:

程式碼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <bits/stdc++.h>
using namespace std;
int selected_door,selected[1000000],make_change=0,keep=0,N,M,open;

int main(){
cin>>N>>open>>M; //輸入門的數量N,主持人開門數open,模擬次數M
srand((unsigned)time(NULL));
for(int i=0;i<M;i++){ //執行M次
selected_door = rand()%N; //選擇一個門放汽車
for(int j=0;j<N;j++){
if(j==selected_door)selected[j]=1;
else selected[j]=0;
}

int audience_selected = rand()%N; //觀眾選擇一個門

for(int j=0,ind=0;j<open;ind++){ //將K扇門打開
if(ind!=audience_selected && ind!=selected_door){
selected[ind]=2;
j++;
}
}

int change_door = 0; //要換到的門
vector<int>vec; //可以換的選擇
vec.clear();
for(int j=0;j<N;j++){
if(j!=audience_selected && selected[j]!=2){
vec.push_back(j);
}
}
int vec_size = vec.size();
change_door = vec[(rand()%vec_size)];
if(change_door == selected_door)make_change++; //紀錄換而贏的次數
else if(audience_selected == selected_door)keep++; //紀錄不換而贏的次數

if(i<4){
cout<<"第"<<i+1<<"次模擬"<<endl;
cout<<"觀眾選擇:"<<audience_selected+1<<" 號門"<<endl;
cout<<"中獎的門為:"<<selected_door+1<<" 號門"<<endl;
cout<<"沒有被主持人打開的門:";
for(int j=0;j<vec_size;j++)cout<<vec[j]+1<<"號門,";
cout<<endl<<"觀眾選擇要換的門為:"<<change_door+1<<" 號門"<<endl;
if(audience_selected == selected_door)cout<<"不換門中獎"<<endl;
else if(change_door == selected_door)cout<<"換門中獎"<<endl;
else cout<<"換門不換門皆不會中獎"<<endl;
cout<<endl;
}
}
cout<<fixed<<setprecision(5); //印出機率
cout<<"不換門贏的機率:"<<(double)keep/M<<endl;
cout<<"換了門贏的機率:"<<(double)make_change/M<<endl;
}

警察抓酒鬼問題

這個問題可以用來比較一下三門問題:

某酒鬼有90%的日子都會出去喝酒,喝酒只隨機去固定的三家酒吧。今天警察找了其中兩家酒吧都沒有找到酒鬼。問:酒鬼在第三家酒吧的機率?

我們假設事件$A_1$為酒鬼喝酒的機率、$A_2$為酒鬼在家的機率,$B_1$為酒鬼在前兩個酒吧被抓的機率、$B_2$為酒鬼沒有在前兩個酒吧被抓的機率

我們要找的是酒鬼沒有在前兩個酒吧被抓的條件下喝酒的機率,可以套用貝氏定理:

正解是75%,也可以顯而易見的用$\frac{30\%}{30\%+10\%}=75\%$得到答案

這題想要討論的是,在三門問題中,主持人是知道哪一些門是沒有汽車的,所以故意打開;但是在這個問題中,警察是不知道哪一個酒吧有酒鬼,兩題本身的前提就不同,不能拿來互相解釋

結論

在分析完三門問題、程式實際模擬和比較其他題目之後,得到一個結論:三門問題中主持人並不是亂選,而是把沒有車的那些門打開,這跟平常直覺的機率想法是不同的!

雖然對大多數人的直覺反應而言,選擇換門與不換門似乎中獎的機率是相同的,但經過上述一連串利用貝氏定理的討論與歸納後,證實了反而換門才是最明智的選擇。「人的認知有兩種,一是先驗的古典機率,一是經驗的機率,前者會干擾後者;鴿子只有後者,在蒙提霍爾問題上,高人一籌。人其實是聰明反被聰明誤。」(曾志朗,2012)