首页 >> 大全

使用蒙特卡洛方法模拟三门问题(C语言)

2023-07-24 大全 28 作者:考证青年

大家好,我是想秃头的小沐!今天给大家带来一个很有意思的小问题,就是非常出名的三门问题,大家先试着看自己能不能解决呢?

问题背景:

三门问题(Monty Hall )亦称为蒙提霍尔问题、蒙特霍问题或蒙提霍尔悖论,大致出自美国的电视游戏节目Let's Make a Deal。问题名字来自该节目的主持人蒙提·霍尔(Monty Hall)。参赛者会看见三扇关闭了的门,其中一扇的后面有一辆汽车,选中后面有车的那扇门可赢得该汽车,另外两扇门后面则各藏有一只山羊。当参赛者选定了一扇门,但未去开启它的时候,节目主持人开启剩下两扇门的其中一扇,露出其中一只山羊。主持人其后会问参赛者要不要换另一扇仍然关上的门。问题是:换另一扇门是否会增加参赛者赢得汽车的机率。如果严格按照上述的条件,那么答案是会。不换门的话,赢得汽车的几率是1/3。换门的话,赢得汽车的几率是2/3。

虽然该问题的答案在逻辑上并不自相矛盾,但十分违反直觉。这问题曾引起一阵热烈的讨论

问题描述:

_什么是蒙特卡洛模拟法_做蒙特卡洛模拟

使用蒙特卡洛方法来模拟三门问题。并证实换门与不换门中奖概率分别为2/3和1/3.

解决方案:

我们在前几次的文章中已经介绍了蒙特卡洛方法并设计程序计算出了PI的值,所以今天不再多做介绍,有需要的小伙伴可以查看前面发布的文章,接下来我们看看具体的代码是怎么实现的。

#include 
#include 
#include 
bool playgame(bool change);
void fun(int n, bool change);
void fun(int n,bool change)
{int wins = 0;for (int i = 0; i < n; i++){if (playgame(change))wins++;}printf("wins=%d\n",  wins);printf("中奖率为%f\n", 1.0*wins / n);
}bool  playgame(bool change) // 模拟游戏
{int car = 1 + rand() % 3;//1,2,3,代表三扇门,car为选手选的那扇门int guesscar = 1 + rand() % 3; //选手选的那扇门if (car == guesscar)return change ? false : true;elsereturn change ? true : false;
}
int main()
{printf("请输入测验次数\n");int textnum;scanf_s("%d", &textnum);printf("如果选择不换门\n");fun(textnum,false);printf("如果选择换门\n");fun(textnum,true);return 0;
}

输入,测试结果如下:

原因分析:

这是一个违背直觉的答案,当主持人开出的那扇门为时,我们选的那扇门和剩下的那扇门的概率应该都是1/2才对,那么为什么会出现这种情况呢?其实,主持人是站在上帝视角来考虑这个问题的,他是知道哪扇门后面是车而哪扇门后面是的。我们把问题想得极端一点,假设有10000张彩票,上帝9999张而你只拿了一张,上帝是知道哪一张有奖的,但你是不知道的,如果上帝一张接一张的把他手中没有中奖的揭开一直到最后一张,最后上帝问你,换还是不换?你会换吗?

答案是当然要换,上帝的那张彩票的中奖概率已经飙升到9999/10000了?你不会仍旧觉得你的那一张会中奖吧!

好啦!大家明白了吧如果能帮到各位铁子的话,欢迎关注小沐,一起学习交流!最后由于作者本身水平有限,如有错误之处,希望各位铁子指正,瑞思拜

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了