Louis Better than before

淺談蒙提霍爾博弈問題 - Monty Hall Program

“The Monty Hall problem is a brain teaser, in the form of a probability puzzle, loosely based on the American television game show Let’s Make a Deal and named after its original host, Monty Hall.”

簡介

蒙提霍爾博(Monty Hall problem)問題源自於數學遊戲問題,又可稱為三門問題。這益智遊戲在電影 21劇情中播放過,遊戲的玩法是:“參與者會看見三扇窗關閉了的門,其中一扇的後面有一輛車,選中後面有的那扇門就可以贏得該汽車,而另外兩扇門後面則各藏有一隻山羊。當參賽者選定了一扇門,但未去開啟它的時候,節目主持人會開啟剩下兩扇門的其中一扇,露出其中一隻山羊。主持人其後會問參賽者要不要換另一扇仍然關上的門。問題是:換另一扇門是否會增加參賽者贏得汽車的機率呢?”

簡易的機率論

最初參賽者選中汽車的機率為1/3,當參賽者選定了一扇門,而主持人開啟剩下兩扇門的其中一扇藏有一隻山羊後,若參賽者堅持不換門,選中汽車的機率為1/3 * 1/2 + 1/3 * 1/2 = 1/3,但參賽者換門,選中汽車的機率將會是 2/3 * 1/2 + 1/3 * 1/2 = 2/3 ~= 66.67%。

門1 門2 門3
汽車 (1/3) 山羊 (1/3) 山羊 (1/3)

事實上,如果你拒絕改變,一開始就選擇正確的門機率只有1%。在另外99%的情況下,改變而選擇正確的門機率可能會提升至66.67%,但這前提是主持人提供而外的信息,在你選擇的當下告知錯誤的門,此時改變選擇才會提升選擇正確的門機率。

由此可見,蒙提霍爾博問題是一個理性選擇和機遇博弈問題。換句話說,這概念可以在訊息不完全的博弈中,分析出如何正確理解概率的含義以及機率變化的問題。

簡易實作

float Solutions::montyHall(int guess)
{
    int winningNum = 0;
    int switchedNum = 0;
    int switchedCount = 0;
    int elimNum = 0;
    for (int i = 0; i < 1000; ++i) {
        winningNum = getRandom(1, 3, 0);
        elimNum = getRandom(1, 3, winningNum);
        switchedNum = getRandom(1, 3, elimNum);
        while (switchedNum == guess ) {
            switchedNum = getRandom(1, 3, winningNum);
        }
        if (switchedNum == winningNum) switchedCount ++;
    }
    return 100 - (switchedCount / 10);
}

int Solutions::getRandom(int low, int high, int badNum)
{
    int random = rand() % high + low;
    while ( random == badNum ) {
        random = rand() % high + low;
    }
    return random;
}

Reference

[1] 三們問題

[2] Monty Hall problem

[3] 決勝21點

[4] Monty Hall program c++

Thanks for reading! Feel free to leave the comments below or email to me. Any pieces of advice or discussions are always welcome. :)