三门问题的原始问题,大家已经讨论出了结论,获胜的概率是2/3

对于一个扩展问题——后来的参与者

主持人打开一扇有羊的门后,参加游戏的人选择换个门,因为换过来是2/3嘛!这时候主持人又从场外找来一个参与者,这个参与者不知道前面发生的事,主持人说这里有两个门,一个门后面有车,一个门后面是只羊,你选一个吧,选到车就归你了!这个人选恰好和第一个选了一样的门,第一个游戏者不屑的说:哥们,别看咱俩站在一起,可是你只有1/2可能性选到车,而我有2/3的可能哦!第二个参与者选到车的可能性无疑是1/2。

我把问题再改一下,这次主持人先打开了一扇有羊的门,再让玩家选择,玩家选择完后再问换不换门。

这样一看,换门获胜的概率总该是1/2了吧。

下面我用c++模拟了一下。

//三门问题,模拟玩家改变决策后的中奖率
#include "pch.h"
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 1000000     //模拟实验次数//先让玩家选择一扇门,然后主持人打开羊门,再让玩家选择一扇门,然后再问玩家换不换门
void fun1()
{printf("先让玩家选择一扇门,然后主持人打开羊门,再让玩家选择一扇门,然后再问玩家换不换门\n");bool doors[3];   //true表示门背后是汽车,false表示门背后是羊int win1 = 0;       //中奖次数int win2 = 0;int tmp1, tmp2;//1为不换门,2为换门 for (int k = 0; k < 10; k++) {win1 = 0;win2 = 0;for (int i = 0; i < N; i++) {doors[0] = false; doors[1] = false; doors[2] = false;doors[rand() % 3] = true;   //rand()%3为0-2的随机数,doors[rand()%3]=true表示随机一扇门背后是汽车int player = rand() % 3;  //玩家选中一扇门int host = rand() % 3; //主持人选一扇门if (doors[host] || host == player)//主持人不能选择和玩家一样的门,也不能选择车门host = (host + 1) % 3;if (doors[host] || host == player)//主持人不能选择和玩家一样的门,也不能选择车门host = (host + 1) % 3;      tmp1 = player;//玩家不换门tmp2 = (player + 1) % 3;//玩家换门if (tmp2 == host)//玩家换的门不能同主持人选的门tmp2 = (tmp2 + 1) % 3;if (doors[tmp1])++win1;if (doors[tmp2])++win2;}float ratio1 = win1 / (float)N;float ratio2 = win2 / (float)N;printf("不换门:%f, 换门:%f\n", ratio1, ratio2, ratio1 + ratio2);}
}//主持人先打开羊门,再让玩家选择一扇门,然后再问玩家换不换门
void fun2()
{printf("主持人先打开羊门,再让玩家选择一扇门,然后再问玩家换不换门\n");bool doors[3];   //true表示门背后是汽车,false表示门背后是羊int win1 = 0;       //中奖次数int win2 = 0;int tmp1, tmp2;//1为不换门,2为换门   for (int k = 0; k < 10; k++) {win1 = 0;win2 = 0;for (int i = 0; i < N; i++) {doors[0] = false; doors[1] = false; doors[2] = false;doors[rand() % 3] = true;   //rand()%3为0-2的随机数,doors[rand()%3]=true表示随机一扇门背后是汽车int host = rand() % 3;  //主持人选中一扇山羊门if (doors[host])       //如果主持人选的是汽车门 host = (host + 1) % 3;int player = rand() % 3; //玩家选一扇门if (player == host)    //如果玩家选的不是主持人选的那扇player = (player + 1) % 3;tmp1 = player;tmp2 = (player + 1) % 3;if (tmp2 == host)tmp2 = (tmp2 + 1) % 3;if (doors[tmp1])++win1;if (doors[tmp2])++win2;}float ratio1 = win1 / (float)N;float ratio2 = win2 / (float)N;        printf("不换门:%f, 换门:%f\n", ratio1, ratio2, ratio1 + ratio2);}
}int main()
{srand((unsigned)time(NULL));fun1();fun2();return 0;
}

运行结果:

为什么第二种情况,概率是9/20呢?一直想不通。

三门问题的扩展用c++模拟相关推荐

  1. Firefox OS 2.0 模拟器 – 使用官方火狐浏览器扩展无痛完美模拟体验火狐手机系统

    在移动设备(手机)越来越红火的今天,除了 Android.iOS.Windows Phone 这些我们熟悉的操作系统之外,一些新生的系统也在蠢蠢欲动了,譬如我们曾经介绍过的 FireFox OS 系统 ...

  2. 利用Spring扩展点模拟MyBatis的注解编程「知识点多多」「扩展点实战系列」- 第448篇

    历史文章(文章累计440+) <国内最全的Spring Boot系列之一> <国内最全的Spring Boot系列之二> <国内最全的Spring Boot系列之三> ...

  3. linux ps2键盘驱动,通用键盘鼠标模拟(包括USB和PS2)

    通过直接调用Kbdclass的回调函数KeyboardClassServiceCallback直接给上层发送键盘驱动.这个方法网上已经公开,参考Hook KeyboardClassServiceCal ...

  4. 回溯法采用的搜索策略_强化学习基础篇(三十四)基于模拟的搜索算法

    强化学习基础篇(三十四)基于模拟的搜索算法 上一篇Dyna算法是基于真实经验数据和模拟经验数据来解决马尔科夫决策过程的问题.本篇将结合前向搜索和采样法,构建更加高效的搜索规划算法,即基于模拟的搜索算法 ...

  5. 通用键盘鼠标模拟(包括USB和PS2)

    2019独角兽企业重金招聘Python工程师标准>>> 通过直接调用Kbdclass的回调函数KeyboardClassServiceCallback直接给上层发送键盘驱动.这个方法 ...

  6. ibm aix 抓包命令_在IBM AIX上模拟丢弃的TCP / IP数据包

    本文介绍: AIX内核扩展,允许来往于指定主机的指定百分比的TCP / IP数据包被随机丢弃,以模拟不利的网络状况. 加载,激活和卸载内核扩展的实用程序. C和Java™实用程序,用于监视到达目标主机 ...

  7. 模拟电子技术200问

    http://www.21ic.com/jichuzhishi/analog/questions/2013-02-18/158429.html 1.半导体材料制作电子器件与传统的真空电子器件相比有什么 ...

  8. Topas——基于Geant4的放射治疗蒙特卡罗算法模拟工具

    Topas--基于Geant4的放射治疗蒙特卡罗算法模拟工具 关于Topas 学习前提 安装Topas 获取topas.tar.gz 获取方法一 获取方法二 配置unix环境 安装Topas 安装Ge ...

  9. Redis高可用集群部署和集群扩展

    文章目录 一.前言 二.集群配置 2.1 说明 2.2 配置 2.3 启动redis 2.4 集群操作 2.5 验证集群 2.5.1 springboot配置文件 2.5.2 代码测试 2.5.3 集 ...

最新文章

  1. 连肝 7 个晚上,总结了 66 条计算机网络的知识点
  2. 给XCODE加一个注释的小插件
  3. phpcms后台进入地址(包含No permission resources错误)
  4. PyCairo 中的剪裁和屏蔽
  5. tomcat(20)基于JMX的管理
  6. 一群阿里人如何用 10 年自研洛神云网络平台?技术架构演进全揭秘!
  7. 解密GaussDB(for Influx)时序洞察
  8. linux中匿名用户怎么登陆_Linux网络配置 | FTP 实战-匿名用户登录
  9. 【渝粤教育】国家开放大学2018年秋季 7160-22T卫生法学 参考试题
  10. 35岁危机?请收下这部转型秘籍
  11. js常用的加密/解密方法
  12. java面试 系统调优_面试官:Java性能调优你会多少?一个问题就把我问的哑口无言,哭了!...
  13. mysql中avg函数如果有空值_对于 AVG 函数,如果列中所有行的值都是 null,那么 AVG 函数返回的值是( )...
  14. Wireshark实践总结
  15. 一日不刷算法题,明日编码临大敌
  16. 【专家访谈】测试专家 陈林钧 访谈记录整理汇总
  17. C语言:求1000以内的完数
  18. 老师的礼物,教师说课教育培训PPT模板
  19. 【中级软考—软件设计师】2操作系统2.9 文件管理【***】:2.9.3 位示图
  20. 大坝安全监测系统:水库“守坝人”!

热门文章

  1. Java 开发规范文档
  2. python获取计算机时间_在Python中获取计算机的UTC偏移量
  3. SSIS Execute SQL Task assign output 的两种方法
  4. 阿里云认证多少分能通过?考试题库在哪里找?
  5. Dubbo comsumer 远程调用流程分析
  6. spring aop分析(一)
  7. 《Hello!树先生》简介
  8. 关联分析(Association Analysis)--挖掘啤酒与尿布的关联规则
  9. 两种简单方法:把输入的整数(最多不超过五位),按输入的反方向输出。例如输入12345,要求输出结果是54321.编程实现此功能。
  10. JPBC库应用之身份基加密IBE