【发布时间】:2018-02-13 23:52:25
【问题描述】:
我最近看了一个关于蒙蒂霍尔问题的视频,觉得它很有趣,所以我想实现它,看看概率是否真的是预测的 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) 是谎言?
附:我实现的逻辑是,如果首先选择了获胜的门,通过切换,我们就输了。如果首先选择丢失的门,通过切换,我们赢了。这就是我对蒙蒂霍尔问题的理解。
编辑:我实际上放了 %4,因为我读到 %4 将代表 0-3。我忘了我需要 1-3,而不是 0-3。问题已解决。
【问题讨论】:
-
仅适用于 3 扇门,但您似乎使用 4
winDoor % 4。有了四扇门,如果一开始你已经选择了,你甚至可以再次选择丢失的门。 -
这实际上并没有模拟 monty hall 问题,问题的数学症结在于庄家打开剩余的门,而玩家选择切换
标签: c random probability