不要小瞧了 Monty Hall problem (三门问题)

1.问题

Monty Hall problem 衍生过许多版本,写进过高中数学教科书思考题,在网上讨论也颇多,但目前看到的结论多数不赞同,或者是被限制了条件。下面来看一下这个悖论的原始版本:

Monty Hall 是美国一个电视游戏节目的主持人,你是参赛者。你面对三扇门(A,B,C),其中一扇门的后面是汽车,另外两扇门后面是山羊,你的目标是赢得汽车。你随机选择一扇门(假设你选择了A),这时主持人打开了C,C后面是一只山羊,并给你一次重新选择的机会。现在汽车只可能在A和B中,你该不该换门,汽车在A和B后面的概率各是多少?

选1号还是选2号?

2.思考

不同的人有不同的思考方式,主要集中在以下几种:

  • 佛性思考法:只剩下两个门了,那么这时候汽车在A或B后面的概率是平等的,换不换无所谓。

  • 反选法:三个门选一个获奖率是1/3,但如果让你同时选两个门就是2/3这是毫无疑问的,你是一个心机girl,心里选了B+C,嘴上对主持人说选A,之后不管她从B或C打开哪一个门(后面是羊),都相当于为你排除了多数中的错误答案,你间接选择了B+C,所以换门的概率更大,为2/3,不换的概率1/3,这是网上最常见的答案,证明方式各有不同,但事实真如此吗?

  • 经验法:祖先告诉了我们经验的重要性,你在不知是否换门之际,掏出手机google了 Monty Hall,发现了她的黑历史,原来,她只在参赛者第一次选对时,才故意打开另一扇门迷惑你。之前所有和你一样参加这个节目的人,凡是第二次换门,最后都空手而归,看到这里后你还坚持换门吗?

3.为什么会有悖论?

除了问题描述本身,还有一个关键之处:Monty Hall 打开另一扇门的动机。这个问题实际是一个缺少先验概率条件概率问题。不妨我们给它补上: Monty Hall 在你选对的情况下打开另一扇门的概率是 x,在你选错的情况下打开另一扇门的概率是 y,这道题才能计算正确答案!现在我们来算一算,当 x, y 符合什么情况该换门,什么情况不该换。

先考虑极端情况:

  • x = y = 1: 应该换!参考反选法。
  • x = 1, y = 0: 必须不换!参考经验法。
  • x = 0, y = 1: 请问这个福利节目现在还有么。
  • x = 0, y = 0: 会导致不存在打开另一扇门的情况,不合理。

根据贝叶斯公式:

贝叶斯公式

可见,不换门赢得汽车的概率,只与y与x的比例有关,下面是x, y在[0,1]范围内的热度图像

水平轴为第一次选对主持人打开另一扇门的概率,垂直轴为第一次选错主持人打开另一扇门的概率
  • y/x 越小,越靠近绿色,汽车在A的概率越接近1,不应该换;
  • y/x 越大,越靠近红色,汽车在A的概率越接近0,应该换;
  • 在图中的黑线 y=0.5x 上,换与不换概率均为0.5

4.Python 验证

利用random随机数,制造出随机的五组x, y 计算理论概率,并模拟实际几率

# -*- coding: utf-8 -*-

__author__ = 'zijian'

import random

def monty_hall_problem(max_trial, x, y):
    done = False
    total_car_in_A = 0
    total_trial = 0
    #Monty Hall 问题大量发生,每一次选A
    while not done:
        #用1,2,3表示汽车在A,B,C
        car_behind_door = random.randint(1,3)    
        if car_behind_door == 1:
            #有x概率开另一扇门,此时不换会赢得汽车
            if random.random() < x:
               total_car_in_A += 1
               total_trial += 1
            #否则不开门,不符合条件
            else:
                continue
        #有y概率开另一扇门,此时不换赢不到
        elif random.random() < y:
            total_trial += 1
        #同样,不符合条件
        else:
            continue
        if total_trial >= max_trial:
            done = True
    return total_car_in_A / total_trial

if __name__ == "__main__":
    for i in range(5):
        #随机选5组随机数
        x = random.random()
        y = random.random()
        #理论值
        p0 = x /(x + 2 * y)
        #实际值
        p = monty_hall_problem(1000000, x, y)
        print("第%s次随机x = %s, y = %s,理论概率 x/(x + 2y):%s"%(i+1, x, y, p0))
        print("第%s次百万数量模拟下,汽车在A门后的几率为:%s,相对误差为%s%%" % (i+1, p, 100*(p - p0)/ p0))

上述代码执行后的结果如下:

第1次随机x = 0.4861871788241564, y = 0.12591280082723066,理论概率 x/(x + 2y):0.6587788066608457
第1次百万数量模拟下,不换门赢的几率为:0.658873,相对误差为0.014298173863823812%
第2次随机x = 0.07298868281286575, y = 0.5447049643017904,理论概率 x/(x + 2y):0.06279144012734585
第2次百万数量模拟下,不换门赢的几率为:0.062931,相对误差为0.22225939136149226%
第3次随机x = 0.42103934207411153, y = 0.6491863485255072,理论概率 x/(x + 2y):0.24487402233634786
第3次百万数量模拟下,不换门赢的几率为:0.24544,相对误差为0.23113013714240673%
第4次随机x = 0.6276282895713531, y = 0.5662725903978403,理论概率 x/(x + 2y):0.3565718380248506
第4次百万数量模拟下,不换门赢的几率为:0.356352,相对误差为-0.06165322142890953%
第5次随机x = 0.6709303930216155, y = 0.7945710048946582,理论概率 x/(x + 2y):0.2968623448466322
第5次百万数量模拟下,不换门赢的几率为:0.296592,相对误差为-0.09106740929768469%
>>>

可见与预期结果一致。

5.这就结束了?

看到这里,你根据节目历史,估算出了x,y,之后通过计算比较了换与不换的概率的大小,去参加节目,是否必有超过一半概率赢回汽车?

答案:当然不是!因为这是一个条件概率问题,你不能保证你去参加节目一定会达成条件。很可能你第一次选错直接 GAME OVER 了。

既然这样计算上面概率还有什么意义呢?我们已经得出这个结论了不是:如果 Monty Hall 打开另一扇门,给我们一次换门的机会,x>2y 时选择不换,否则选择换。所以,还需一步就可以推导不含条件的全概率公式:

不同条件下的全概率公式

化简①式,结果为:1/3,
化简②式,结果为:(1+2y-x)/3

下面是全概率下的热度图像

还是有必要解释一下,这个图片是参加比赛之前根据x,y,计算得到最可能赢得汽车的概率;举个例子,x=0,y=0.25,如果提供了换门机会,那换门胜率将是100%,因为你若第一次选对主持人根本不会开另一扇门!但你无法在比赛前确定会有换门机会,所以综合胜率是50%

这个结果是符合常理的,仅当x=0,y=1情况,参赛者必赢(要么第一次选对直接赢得汽车,要么第一次选错100%开门,第二次换门赢得汽车),其他情况下,根据不同的x,y,赢得汽车的概率在1/3和1之间

6.结论

如果你是参赛者,并且希望赢走汽车,为了提高成功率一定要提前知道 Monty Hall 的策略(根据节目历史估算 x, y)

如果你不知道该不该参加节目,可以通过 汽车价格 × 上面的概率 计算 期望值,如果期望值大于入场门票价格,那么,大量参加节目是稳赚不赔的(当然在 Monty Hall 不会针对你多次竞猜而改变策略前提下)。事实上,2005年2月,美国的某一个彩票品种由于设计不周,真的出现过稳赚不赔的情况,被麻省理工一名学生发现并通过反复购买赚到了300万美元。链接

那么转换思维,如果你是 Monty Hall 呢,你当然不希望参赛者轻松的赢走门后的汽车,应该怎么做?

短期做法:

  • 如果对方坚持“必换”原则,那么,恭喜你,要么他第一次选错,要么他第二次选错。
  • 如果对方坚持“不换”原则,那么也恭喜你,他最多有1/3的概率赢得汽车,如果一次选中,试试能不能说动他换一扇门吧。
  • 如果对方相当聪明,或者他看完了这篇文章,并通过统计知道了你的习惯,那么他将很有可能赢得汽车。
  • 如果他的小聪明被你看出,那么针对这一次采取相反策略吧。
  • 如果他也看出了你这一次要用相反策略,那...剩下时间留给脑补。

长期做法:

  • 保持x>=2y,即参赛者第一次选对下打开另一扇门,提供换门机会的概率,要大于等于选错情况下提供换门机会的2倍(保持2倍关系即可,相差再大不会影响效果,反而可能会被诟病)。这种情况下任凭参赛者再聪明,也无法奈何,只有1/3的概率赢走汽车。

本文完。与个人博客同步更新

原创文章,如需转载,请注明来源。

如需联系作者:[email protected]

你可能感兴趣的:(不要小瞧了 Monty Hall problem (三门问题))