1. 程式人生 > 其它 >蒙提霍爾問題

蒙提霍爾問題

題面

這其實是一個廣為人知的問題。假設有這麼個遊戲,主持人拿了三個盒子,其中有一個有獎,另外兩個是空的。你有兩次選擇機會,在第一次選擇後,主持人沒有告訴你你選的盒子有沒有獎,而是打開了另外兩個盒子中的一個,並且告訴你這個盒子沒獎。現在輪到你選第二次,你是換盒子還是不換呢?

一般來說有兩種回答,第一種觀點認為,現在剩下的兩個盒子一個有獎一個沒獎,概率當然是 $ 1\over2 $ ,換不換都一樣。另一種結論則是,目前選擇的盒子有獎的概率為 $ 1\over 3 $ ,沒獎概率是 $ 2\over 3 $ ,當然是換嘛。

在高中學習過條件概率的 $ hmj $ 立刻覺得第二種觀點有問題!明明都已經告訴一個盒子是空的了,這條件概率能一點不變?然而概統老師無情地告訴我們,第二種觀點是對的。於是 $ hmj $ 苦思冥想了半節概統課,最終直到晚課通核摸魚時才有點眉目。

這到底是怎麼會事呢?

既然高中貧乏的概率論知識不管用了,我們還是使用嚴謹的式子先來表示下問題。

我們給盒子編號為 1、2、3,並且假設我們選的是 1 號:

\[設事件\; A=中獎、B=1\,號盒子有獎、C=主持人告訴我們的新資訊\\ 那麼在不換盒子時:\quad\begin{align*} P(A|C)& =P((A\cdot B) |C)+P((A\cdot\bar B)|C)\\ & = P((A|B)|C)\cdot P(B|C)+P((A|\bar B)|C)\cdot P(\bar B|C)\\ & = 1\cdot P(B|C)+0\cdot P(\bar B|C)\\ & = P(B|C) \end{align*} \]\[換盒子時:\quad\begin{align*} P(A|C)& =P((A\cdot B) |C)+P((A\cdot\bar B)|C)\\ & =P(\bar B|C) \end{align*} \]

可以看到兩個值都取決於條件概率 $ P(B|C) $ 。而這個概率又和我們的 $ C $ 事件有關,我們就從不同的 $ C $ 的表述來討論一下。

  • \(i\)

從最直覺的方面來想,主持人告訴了我們一個盒子為空,不妨假設為 2 號盒子,此時 \(C=2\,號盒子為空\),於是有:

\[P(B\cdot C)=\frac{1}{3}\;, P(C)=\frac{2}{3}\;\implies P(B|C)=\frac{1}{2} \]

於是乎,我們得到了得到結論一……沒辦法,我們只能認為這個假設 \(C\) 有點問題。怎麼設定新的事件 \(C\) 呢?在某乎查到的一個觀點給了我一些頭緒,這個觀點認為,如果主持人隨機在另外兩個盒子中開了一個,剛好是空的,那麼結論一就是正確的。而如果主持人知道哪個盒子是空的,只打開這個,那麼就是結論二正確。

  • $ ii $

順著這個思路,我們考慮新的事件 $ C $ 。這回假設事件 $ C=主持人在,2、3,盒子裡隨機選取了一個,剛好沒有獎 $ ,於是有:

\[設\,D=2\,號盒有獎\\ P(B\cdot C)=\frac{1}{3}\\ \begin{align*} P(C) & =P(C\cdot D)+P(C\cdot \bar D\cdot\bar B)+P(C\cdot B)\\ & =P(C|D)\cdot P(D)+P(C|\bar D\cdot\bar B)\cdot P(\bar D\cdot\bar B)+\frac{1}{3} \\ & =\frac{2}{3} \end{align*}\\ \therefore P(B|C)=\frac{1}{2} \]

果然,我們再次回到了結論一。

  • $ iii $

根據上面的討論,我們不妨大膽猜測,只有 \(P(C)=1\) 時才能達到結論二。而上述觀點的第二不妨剛好是這個情況。

在這種情況下,主持人知道哪個盒子是空的,也就是隻開啟空盒子。對於 \(C\) 更加貼切的表述應該是“打開了一個空的盒子”,而不是“開啟的盒子是空的”。即 $ C=從剩下兩個盒子中打開了一個空盒子 $ ,此時 $ P(C)=1 $ ,因為剩下的兩個盒子至少有一個沒獎!

結論

至此,我們得到一個可能的結論,將兩種不同的結論歸結於主持人的兩種行為方式。但是我們仍然很難感性理解這個結論,我們可以對這個結論提出明顯疑問:其一,為何主持人主觀的行為方式會影響這個遊戲;其二,作為遊戲的參與者,我們只知道有一個盒子被打開了,為何會有兩種結果。

對於第一點,我們要明白,概率永遠是基於現有資訊,而不是基於具體事物。主持人的行為方式恰恰不是一個簡單的主觀事件,而是影響關鍵事件概率的要點。如果說我們不是參加這個遊戲的人,只是路過看到兩個盒子中的一個有獎,那麼概率當然是 \(1\over 2\) 。第二點則是這個問題違反直覺的原因,從參與者來看,我們很容易忽略主持人是知道盒子資訊的,從而漏掉了一個條件。殊不知加上這個條件後,”有一個盒子被開啟“完全變成了另一個事件。

終於,我們有了一個直覺和理論上都能滿足需求的結論。最後不妨再用實驗驗證一下。

點選開啟摺疊的程式碼
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int pow(int x, int p) {
    int ret = 1;
    while (p) {
        if (p & 1 == 1) ret *= x;
        x *= x;
        p >>= 1;
    }
    return ret;
}
//重複試驗1000000次
int t = 1000000;
//使用二進位制表示是否有獎,如cha=1代表最初選擇1號盒子
int state, cha = 1, chb;
//ans1/ans2表示獎在我們第一次選中的盒子的次數
//其中 ans1是主持人只選空盒,ans2隨機選
//oth表示主持人隨機選一個盒子,選中有獎的盒子的次數,
//用以調整隨機選取情況的基數
int ans1, ans2, oth;
int main(int argc, char* argv[]) {
    srand((unsigned)time(NULL));
    while (t--) {
        state = pow(2, rand() % 3);
        chb   = pow(2, rand() % 2 + 1);
        if (chb & state) oth++;
        else if(cha & state) ans2++;
        if (cha & state) ans1++;
    }
    printf("%lf %lf", 1.0 * ans1 / 1000000, 1.0 * ans2 / (1000000 - oth));
    //0.333409 0.500310
    return 0;
}

(我覺得這種話裡有話的題目……屬實害人)