淺談蒙提霍爾博弈問題 - Monty Hall Program
01/26/2022 Tags: Mathematics“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] 三們問題
[3] 決勝21點
Thanks for reading! Feel free to leave the comments below or email to me. Any pieces of advice or discussions are always welcome. :)