三门问题又被称为蒙提霍尔问题,出自美国的一个电视游戏节目。
逻辑很简单,但结果就是不太能让人接受,现在详细讲一下这个问题。
题目非常简单:参赛者面前有三扇门,其中一扇门后面有一辆小汽车,另外两扇门后面都是山羊,如果参赛者选中有汽车的那扇门,就可以把汽车开回家。
当参赛者选择了其中一扇门后,此时主持人打开剩余两扇门其中的一扇,里面是一只山羊,那么现在主持人给参赛者一次重新选择的机会,参赛者应不应该换门去选择另外一扇门?
有人认为:
小汽车在剩余两个门内的概率必然都是 50%,那么换不换门其实意义不大,因为概率都一样。
但是答案却是:
如果参赛者坚持原来的选择,那么选中小汽车的概率为 1/3,如果换门的话,选中小汽车的概率为 2/3。
应该大部分都会这么认为,毕竟只剩下两个了,你为什么说不是一半一半的概率呢?
其实这是个数学问题,不能用直觉来判断。接下来从一下角度来说下原因。
从数学的角度,画个图来看下
这样能理解了吗?
如果不换门,选中的概率为 1/3 * 1/2 + 1/3 * 1/2 + 0 + 0 = 1/3
如果换门,选中的概率为 0 + 0 + 1/3 * 1+ 1/3 * 1 = 2/3
再换一个角度,从代入法来看这个问题:
首先,三个门选手选择一个,中车概率是三分之一,其他两个门加起来就是三分之二。这时候,主持人在另外两个门里选择了一个错误答案。那是不是可以理解,这两扇门中奖的概率还是三分之二,但是全都转嫁到剩下的门上了呢?毕竟概率一开始就是定下来的,不会随着门的消失而消失。
再或者,我们自己取大量的数据进行实现,看看结果:
import random
# 模拟测试的次数
simulationCount = 1000000
# 第一次选中小汽车的次数
firstSelectedSuccessSum = 0
# 第二次重新选择选中小汽车的次数
secondSelectedSuccessSum = 0
for num in range(simulationCount):
# 初始化所有门
doors = list(range(1,4))
# 随机生成小汽车的门位置
carDoor = random.randint(1,3)
# 参赛者随机选中一个
firstSelectedDoor = random.randint(1,3)
# 主持人在剩下的两个里面随机选择一个
doors.remove(firstSelectedDoor)
presenterSelectedDoor = doors[random.randint(0,1)]
# 主持人选择后剩下的一个门,也就是选手第二次选择的门
doors.remove(presenterSelectedDoor)
secondSelectedDoor = doors[0]
# 因为主持人不能选择有小汽车的门
# 所以如果上面主持人随机选择的是有小汽车的门,则应该重新选择另一个门
if carDoor == presenterSelectedDoor:
secondSelectedDoor = presenterSelectedDoor
# 如果第一次选中有小汽车的门,累计计数
if carDoor == firstSelectedDoor:
firstSelectedSuccessSum = firstSelectedSuccessSum + 1
# 如果第二次重新选择选中有小汽车的门,累计计数
elif carDoor == secondSelectedDoor:
secondSelectedSuccessSum = secondSelectedSuccessSum + 1
# 输出测试结果
print ('模拟测试 %s 次'%simulationCount)
print ('不换门选中的次数为 {} 次,概率为:{:.2%}'.format(firstSelectedSuccessSum, firstSelectedSuccessSum/simulationCount))
print ('换门后选中的次数为 {} 次,概率为:{:.2%}'.format(secondSelectedSuccessSum, secondSelectedSuccessSum/simulationCount))
结果显而易见,和上述分析的结果一样,坚持最初的选择,选中小汽车概率 1/3,换门后选中小汽车概率 2/3。