2017-09-05 53 views
2

我最近觀看了一個關於蒙蒂霍爾問題的視頻,並發現它很有趣,所以我想實施它來查看概率是否如預測的那樣真正達到了66.6%。蒙蒂霍爾執行

這裏是我有什麼,

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

int main() 
{ 
    int repeat = 5000000, i; 
    int win = 0, lose = 0; 

    for (i = 1; i <= repeat; i++) { 
     int winDoor = rand(); 
     winDoor = winDoor % 4; 

     int firstPick = rand(); 
     firstPick = firstPick % 4; 

     if (winDoor == firstPick) { 
      lose++; 
     } else { 
      win++; 
     } 
    } 

    printf("%.2f percent win rate\n", ((float)win/(float)repeat)*100.00); 
} 

但是,我似乎得到一個雙贏率爲75%(按開關門)與上面的代碼。我的代碼有問題嗎?還是66.6%(2/3)的謊言?

P.S.我實施的邏輯是,如果首先挑選勝利門,通過切換,我們輸了。如果首先挑選失敗的門,通過切換,我們贏了。這就是我理解蒙蒂霍爾問題的方式。

編輯:我實際上把%4寫入,因爲我讀到%4將代表0-3。我忘了我需要1-3,而不是0-3。問題解決了。

+1

只適用於3門,但你似乎使用4'winDoor%4'。如果剛開始你已經做了四門,你甚至可以再次選擇一個鬆動的門。 – Yunnosch

+0

這實際上並沒有效仿蒙蒂爾大廳的問題,問題的數學癥結在於莊家打開剩餘的門,玩家選擇切換 –

回答

3

原因是您使用% 4而不是% 3。這模擬4門而不是3門,所以結果從2/3變爲3/4

+0

沒有解釋75%的機會,這是錯誤的計算。三門以上的機會低於2/3,而不是更高。如果用3/4表示切換時獲勝的機會,那實際上是錯誤的。 – Yunnosch

+1

@Ynnosch假設在初始選擇之後,除了兩扇門之外的所有門都會顯示,如果您總是切換,機會確實會增加。 (嘗試100門,你有99%的機率獲勝。) –

+0

@BilltheLizard感謝那些有趣的信息。我在想,沒有演員會提供... – Yunnosch

2

您從4門選擇,而不是3.將%4更改爲%3。

include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

int main() 
{ 
    int repeat = 5000000, i; 
    int win = 0, lose = 0; 

    for (i = 1; i <= repeat; i++) { 
     int winDoor = rand(); 
     winDoor = winDoor % 3; 

     int firstPick = rand(); 
     firstPick = firstPick % 3; 

     if (winDoor == firstPick) { 
      lose++; 
     } else { 
      win++; 
     } 
    } 

    printf("%.2f percent win rate\n", ((float)win/(float)repeat)*100.00); 
} 
+0

不用擔心,每個人都會犯錯誤:)很高興幫助! – JohnDoe