蒙提霍尔悖论(三门问题)终极分析(补充)附完整源码

上一篇文章分析了经典的蒙提霍尔问题,最后的结论是更换选择后有2/3的机会中奖。蒙提霍尔问题到此已经完结,但事实却并非如此。

在蒙提霍尔问题中,主持人事先知道汽车在哪个门后面,并且他一定会选择没有汽车的那扇门。如果我们稍稍改变一下前提,主持人事先也不知道汽车在哪个门后面,他只是随便打开2扇门中的一扇,并且恰好这扇门后面是山羊,那么此时的情况又是怎样的呢?

如果你看了上一篇文章,你可能会不假思索地认为两者是完全一样的,因为反正都是主持人帮我们排除掉了一只山羊嘛!

没错,在某一次特定的选择中,这两种情况并没有不同,但实际上两种前提隐含的样本数却是不同的。

现在我们假设这个节目在播出前录制了一万次。

第一种情况,主持人事先知道山羊在哪扇门中,那么如果不出意外的话,这一万次录制都能够顺利完成,作为导演,我们只需从中选择某一次即可。因此样本数为1万。

但如果主持人事先并不知道山羊在哪个门中的话,那么一万次录制中将大约有3300次是失败的,因为主持人有1/3的可能会选中汽车,而这与节目的要求是不符的。因此最终只有大约6700次录制是有效的。也就是说,这种情况下的样本数变了,变为了原来的2/3。

在上一篇文章中,我们有一个重要的结论:当选择了A门之后,A门的中奖几率将不再改变。注意这一结论是相对于原样本数的几率。也就是说我们选择A门的中奖几率是1/3是相对于1万次录制来说的。当我们把主持人选到山羊的那大约6700次录制单独拿出来计算A门的中奖几率时,此时A门的新的中奖几率将变为:

1/3 ÷ 2/3 = 1/2

仍然可以用上一篇文章的方法来考虑这个问题,只是可能的情况由3种变成了6种:

(1) 参赛者选择山羊A,主持人选择山羊B

(2) 参赛者选择山羊A,主持人选择汽车
(3) 参赛者选择山羊B,主持人选择山羊A
(4) 参赛者选择山羊B,主持人选择汽车
(5) 参赛者选择汽车,主持人选择山羊A
(6) 参赛者选择汽车,主持人选择山羊B

6种情况的几率都是1/6,但是2和4两种情况是无效的,因此无论是否变更选择,都各有一半的几率会中奖。

这实际上是另一种人为干预的结果,我们从结果中剔除那些不符合条件的部分从而让事物的发展符合我们的预期。这就像人类对物种的人工选择行为,遗传的变异几率在人工的选择过程中被放大了,从而让繁殖出的后代更加符合我们的预期。

上代码:

int totalTimes = 1000000;
int bingo = 0;
boolean[] boxes;
int actuallyTotalTimes = 0;
for (int i = 0; i < totalTimes; i++) { // loop 1 million times
     boxes = new boolean[] {false, false, false};
     boxes[random(3)] = true;

     int myChoice = random(3);
     int hostChoice = random(3, myChoice);
     if (boxes[hostChoice]) {
          continue;
     }

     actuallyTotalTimes++;
     if (!boxes[myChoice]) {
          bingo++;
     }
}
return (double ) bingo * 100 / actuallyTotalTimes;

主持人不再是只选择山羊,而是在剩下的2扇门中随机选择。actuallyTotalTimes是有效的样本数量,仅在主持人没有选中汽车时才会增加,因此有效的样本数量仅为总样本数的2/3。

完整代码下载(包括上一篇的2段代码): http://pan.baidu.com/s/1i3niOvF

时间: 2024-10-10 08:11:37

蒙提霍尔悖论(三门问题)终极分析(补充)附完整源码的相关文章

Android:手把手带你分析 Protocol Buffer使用 源码

前言 习惯用 Json.XML 数据存储格式的你们,相信大多都没听过Protocol Buffer Protocol Buffer 其实 是 Google出品的一种轻量 & 高效的结构化数据存储格式,性能比 Json.XML 真的强!太!多! 由于 Google出品,我相信Protocol Buffer已经具备足够的吸引力 今天,我将讲解Protocol Buffer使用的源码分析,并解决以下两个问题: a. Protocol Buffer序列化速度 & 反序列化速度为何如此快 b. Pr

BAT资深工程师由浅入深分析Tp5&amp;Tp6底层源码 - 分享

BAT资深工程师由浅入深分析Tp5&Tp6底层源码 第1章 课程简介(一定要看,知道整体介绍,方能更好的学习后续课程) 本章主要让大家知道本套课程的主线, 导学内容,如何学习源码等,看完本章要让小伙伴觉得这个是必须要掌握的,并且对加薪有很大的帮助. 第2章 [TP5灵魂]自动加载Loader 深度分析(重点章节,请认真听,建议多次回听) 本章主要讲解为什么要学习自动加载,带领大家看看TP框架的执行流程是什么样子.学习自动加载的原理以及TP5内部自动加载的代码分析.TP 结合composer相关的

蒙提-霍尔悖论(三门问题)终极分析

三门问题——亦称为蒙提霍尔问题,出自美国的电视游戏节目Let's Make a Deal.问题的名字来自该节目的主持人蒙提·霍尔(Monty Hall)[2].问题是这样的: 参赛者面前有三扇关闭着的门,其中一扇的后面是一辆汽车,选中后面有车的那扇门就可以赢得该汽车,而另外两扇门后面则各藏有一只山羊.当参赛者选定了一扇门,但未去开启它的时候,主持人会开启剩下两扇门中的一扇,露出其中一只山羊.主持人其后会问参赛者要不要更换选择,选另一扇仍然关着的门. 据说此节目一经播出就引起了一场热烈的讨论,有人

[Android实例] Scroll原理-附ScrollView源码分析 (转载)

想象一下你拿着放大镜贴很近的看一副巨大的清明上河图, 那放大镜里可以看到的内容是很有限的, 而随着放大镜的上下左右移动,就可以看到不同的内容了 android中手机屏幕就相当于这个放大镜, 而看到的内容是画在一个无限大的画布上~ 画的内容有限, 而手机屏幕可以看到的东西更有限~ 但是背景画布是无限的 如果把放大镜的移动比作scroll操作,那么可以理解,这个scroll的距离是无限制的~ 只不过scroll到有图的地方才能看到内容 参考ScrollView理解, 当child内容过长时,有一部分

AWStats 日志分析系统(含源码包)

前言 在上一篇文章中写了关于httpd的一些简介.配置.那么我们应该知道,HTTP服务器的访问量非常庞大,在它的访问日志文件access_log 中,记录了很多很多客户的访问信息,维护的管理人员会通过分析这些信息,可以及时的了解Web的访问情况,比如每天或特定时间段的访问IP数量.点击量大的页面.那么就是因为访问量太多,信息量太大,所以导致管理员不方便与管理,分析.AWStats日志分析系统就诞生,下面介绍一下AWStats分析系统 有兴趣的朋友可以看看上一篇的httpd简介与配置. AWSta

面试官:你分析过线程池源码吗?

线程池源码也是面试经常被提问到的点,我会将全局源码做一分析,然后告诉你面试考啥,怎么答. 为什么要用线程池? 简洁的答两点就行. 降低系统资源消耗. 提高线程可控性. 如何创建使用线程池? JDK8提供了五种创建线程池的方法: 1.创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待. 1 public static ExecutorService newFixedThreadPool(int nThreads) { 2 return new ThreadPoolExecutor(

实验报告: 人脸识别方法回顾与实验分析 【OpenCV测试方法源码】

趁着还未工作,先把过去做的东西整理下出来~   Github源码:https://github.com/Blz-Galaxy/OpenCV-Face-Recognition (涉及个人隐私,源码不包含测试样本,请谅解~) 对实验结果更感兴趣的朋友请直接看 第5章 [摘要]这是一篇关于人脸识别方法的实验报告.报告首先回顾了人脸识别研究的发展历程及基本分类:随后对人脸识别技术方法发展过程中一些经典的流行的方法进行了详细的阐述:最后作者通过设计实验对比了三种方法的识别效果并总结了人脸识别所面临的困难与

[转] jQuery源码分析-如何做jQuery源码分析

jQuery源码分析系列(持续更新) jQuery的源码有些晦涩难懂,本文分享一些我看源码的方法,每一个模块我基本按照这样的顺序去学习. 当我读到难度的书或者源码时,会和<如何阅读一本书>结合起来进行学习.推荐读读这本书,你可以从这里和这里下载. 第一部分:检视阅读 1. 收集参考资料:官方文档.书籍.百度/谷歌,专题/博客等,快速的浏览,对涉及的知识点.范围.深度.是否有参考意义等有大致的了解和判断,知道这些文章的作者想要解释或解决什么问题. 第二部分:分析阅读 2. 细读官方文档,官方有非

Spring的IOC分析(二)源码

承接上节继续,分析Ioc的工作原理,在典型的 IOC 场景中,容器创建了所有对象,并设置必要的属性将它们连接在一起(同时一个叫DI"依赖注入"或DL"依赖查找"的概念,在C++,java,php以及.net中也是用到过,但是Spring中也把IOC叫做依赖注入,这是找到资料上面是这样写的),决定什么时间 调用方法.从源码的角度看这个过程是怎样实现一下几步: 定位 载入 初始化 注册 依赖注入使用 在上章节里ClassPathXmlApplicationContext