【问题标题】:Monty Hall implementation蒙蒂霍尔实施
【发布时间】: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


【解决方案1】:

您从 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);
}

【讨论】:

  • 别担心,每个人都会犯错 :) 很高兴为您提供帮助!
【解决方案2】:

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

【讨论】:

  • 不解释 75% 的几率,这是错误计算的。超过三扇门的机会低于 2/3,而不是更高。如果用 3/4 表示切换时的获胜机会,实际上是错误的。
  • @Yunnosch 如果您总是切换,那么机会确实会增加更多门,假设在初始选择后除了两扇门外,所有门都被显示出来。 (尝试 100 扇门,您将有 99% 的获胜机会。)
  • @BilltheLizard 感谢您提供有趣的信息。我在想没有一个节目主持人会提供那个......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-03
  • 1970-01-01
  • 2012-10-18
  • 1970-01-01
  • 1970-01-01
  • 2014-04-29
  • 2010-11-17
相关资源
最近更新 更多