(转贼)一道经典概率问题

之前在哪部电影里面有这个桥段来着~

本文转载自nju_hupeng《zt 一道经典概率题的终极解法》

今天在精华区看见了关于那道经典概率题的讨论,一长串帖子,虽然“标准”解法在那里,但是标准解法的方法在不断的诘问面前说服力不够。在一番思考之后,我觉得我找到了一个比较有说服力的方法,即用贝叶斯公式避免先验后验的纠缠。 不知我的逻辑对否,欢迎大家指正:

经典题目: 
有三个门,里面有一个里有汽车,如果选对了就可以得到这辆车, 
当应试者选定一个门之后,主持人打开了另外一个门,空的。 
问应试者要不要换一个选择。 
假设主持人知道车所在的那个门。

经典解法(结论倒是正确的): 
第一次选择正确的概率是1/3 
因此汽车在另外两个门里的概率是2/3 
主持人指出一个门,如果你开始选错了(2/3概率),则剩下的那个门里100%有汽车 
如果你第一次选对(1/3)了,剩下那个门里100%没汽车。 
所以主持人提示之后,你不换的话正确概率是1/3*100%+2/3*0=1/3 
你换的话正确概率是1/3*0+2/3*100%=2/3

我先说说这个经典解法的问题吧。对于这个解法的诘问就在于,现在主持人已经打开一个空门了(而且主持人是有意打开这个门的),在这一 “信息” 出现后,还能说当初选错的概率是2/3吗?这一后验事实不会改变我们对于先验概率的看法吗?答案是会的。更具体地说,主持人打开一扇门后,对当初选择错误的概率估计不一定等于2/3。 
        从头说起。假设我选了B门,假设主持人打开了C门,那么他在什么情况下会打开C门呢? 
        若A有车(先验概率P=1/3),那主持人100%打开C门(他显然不会打开B); 
        若B有车(先验概率P=1/3),那此时主持人有A和C两个选择,假设他以K的概率打开C(一般K=1/2,但我们暂把它设成变量); 
        若C有车(先验概率P=1/3),那主持人打开C的概率为0(只要他不傻。。。) 
  
已知他打开了C,那根据贝叶斯公式——这里P(M|N)表示N事件发生时M事件发生的概率: 
P(B有车 | C打开)=P(B有车 | C打开)/ P(C打开)= (1/3)*K / [(1/3)*1+(1/3)*K] = K / (K+1) 
该值何时等于1/3 呢(也就是经典解法里的假设)? 只有 K=1/2 时。 也就是一般情况下。但如果主持人有偏好,比方说他就是喜欢打开右边的门(假设C在右边),设K=3/4, 那么B有车的概率就变成了 3/5,不再是1/3,后验事实改变了先验概率的估计!

但这并不改变正确的选择,我们仍然应该改选A门, 解释如下: 
P(A有车 | C打开)= P(A有车 | C打开)/P(C打开)=(1/3)*1 / [(1/3)*1+(1/3)*K] =1/(K+1)

而K < 1(假设主持人没有极端到非C不选的程度), 
 所以永远有  P(B有车 | C打开) < P( A有车 | C打开)      
 A有车的概率永远比B大,我们还是应该改变选择。

这个解法的重点在于考虑了C被打开这个事实的影响,从而消除了关于先验后验的纷扰。

时间: 2024-08-07 08:11:41

(转贼)一道经典概率问题的相关文章

ZOJ3329之经典概率DP

One Person Game Time Limit: 1 Second      Memory Limit: 32768 KB      Special Judge There is a very simple and interesting one-person game. You have 3 dice, namely Die1, Die2 and Die3. Die1 has K1 faces. Die2 has K2 faces. Die3 has K3 faces. All the

牛顿迭代法与一道经典编程问题

牛顿迭代法(Newton's method)又称为牛顿-拉夫逊(拉弗森)方法(Newton-Raphson method).它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法. 既然牛顿迭代法能够用来求解方程的根,那么最好还是以方程 x2=n 为例,来试着求解它的根. 为此. 令f(x)=x2?n, 也就是相当于求解 f(x)=0 的解.如上图所看到的. 首先随便找一个初始值 x0,假设 x0不是解,做一个经过 (x0,f(x0)) 这个点的切线,与x轴的交点为x1.相同的道理.假

约瑟夫环问题,一道经典的数据结构题目

问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数.求胜利者的编号. 一般我们采用一个循环队列来模拟约瑟夫环的求解过程,但是如果n比较大的时候,采用模拟的方式求解,需要大量的时间来模拟退出的过程,而且由于需要占用大量的内存空间来模拟队列中的n个人,并不是一个很好的解法. 在大部分情况下,我们仅仅需要知道最后那个人的编号,而不是要来模拟一个这样的过程,在这种情况下,可以考虑是否存在着一种数学公式能够直接求出最后那个人的编号. 我们知道第一个人(编号

解析js中作用域、闭包——从一道经典的面试题开始

如何理解js中的作用域,闭包,私有变量,this对象概念呢? 就从一道经典的面试题开始吧! 题目:创建10个<a>标签,点击时候弹出相应的序号 先思考一下,再打开看看 //先思考一下你会怎么写,是不是这样? 可是结果呢,弹出来的都是10,为啥? var i,a for(i=0;i<10;i++){ a=document.createElement('a') a.innerHTML=i+'<br>' a.addEventListener('click',function(eve

经典概率题等概率取数/蓄水池问题等

题目:给一副扑克牌和一个随机数函数,设计一个洗牌算法. 解析:最直观的思路是什么?很简单,每次从牌堆中随机地拿一张出来.那么, 第一次拿有52种可能,拿完后剩下51张:第二次拿有51种可能,第三次拿有50种可能, …,一直这样随机地拿下去直到拿完最后1张,我们就从52!种可能中取出了一种排列, 这个排列对应的概率是1/(52!),正好是题目所要求的. 接下来的问题是,如何写代码去实现上面的算法?假设扑克牌是一个52维的数组cards, 我们要做的就是从这个数组中随机取一个元素,然后在剩下的元素里

java并发编程--一道经典多线程题的2种解法

问题的描述 启动3个线程打印递增的数字, 线程1先打印1,2,3,4,5, 然后是线程2打印6,7,8,9,10, 然后是线程3打印11,12,13,14,15. 接着再由线程1打印16,17,18,19,20....以此类推, 直到打印到75. 程序的输出结果应该为: 线程1: 1 线程1: 2 线程1: 3 线程1: 4 线程1: 5 线程2: 6 线程2: 7 线程2: 8 线程2: 9 线程2: 10 ... 线程3: 71 线程3: 72 线程3: 73 线程3: 74 线程3: 75

2015 百度笔试的一道经典题目

请编码实现memcpy函数:void *memcpy(void *dst,const void *src,unsigned int count)  显然是内存复制函数 下面是本人结合memcpy的源代码实现的一个测试用例,请大家指点 #include <stdio.h> void *memcpy(void *dst,const void *src,unsigned int count) { char *p_dst = (char *)(dst); char *p_src = (char *)(

6,又一道经典的微软题

一.题目描述 The Orchid Pavilion(兰亭集序) is well known as the top of “行书”in history of Chinese literature. The most fascinating sentence is "Well I know it is a lie to say that life and death is the same thing, and that longevity and early death make no diff

一道经典面试题(雅虎面试题)你真的了解HTML吗?

有这么一段HTML,请挑毛病: <P>  哥写的不是HTML,是寂寞.<br><br>  我说:<br>不要迷恋哥,哥只是一个传说 出这道题的动机是,太多人觉得HTML太简单,但它恰恰又是前端开发中最基础最重要的部分.HTML结构设计的合不合理,直接影响到代码易不易维护,灵不灵活,同时事关网页性能,协作效率. 这道题的考点: 考点1:html和 xhtml的区别这行代码在html 4.01 strict下是完全正确的,在xhtml 1.0 strict下是错