蒙蒂霍尔实施

时间:2017-09-05 15:57:34

标签: c random probability

我最近观看了一段关于Monty Hall问题的视频并发现它很有趣,所以我想实现它以确定概率是否真的像预测的那样是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。我实施的逻辑是,如果首先选择获胜门,通过切换,我们输了。如果首先选择失败的门,通过切换,我们赢了。这就是我对Monty Hall问题的理解。

编辑:我实际上放了%4,因为我读到%4代表0-3。我忘记了我需要1-3,而不是0-3。问题解决了。

2 个答案:

答案 0 :(得分:3)

原因是您使用% 4代替% 3。这模拟了4个门而不是3个,因此结果从2/3变为3/4

答案 1 :(得分: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);
}