题目:假设你参加一个电视游戏节目,节目现场有三扇门,其中一扇门后面是一辆车,另外两扇门后面则是山羊。主持人让你选择其中的一扇门。不妨假设你选择了一号门吧。主持人故意打开了另外一扇门,比如说三号门,让你看见三号门的后面是山羊。然后主持人问你,“你想改变你的选择,换成二号门吗?”这时候,你会怎么做?
学过概率论都知道,理论上换门后中奖概率应该是2/3
我写了个程序模拟了一下。
实验过程:
Talk is cheap. Show me the code.
#goat_gate.py
from random import randint
from random import choice
from tqdm import trange
def left(a,b):#函数left:3扇门里除了a和b剩下的门里随机选一扇(a和b可能相等)
l = []
for i in range(1,4):
if i!=a and i!=b:
l.append(i)
return choice(l)
if __name__ == '__main__':#主程序
hits = 0 #换门后猜中的次数
N = 1000000 # 模拟次数。只有一块cpu所以次数就不设太大了。
for t in trange(N):
car = randint(1,3) #随机一扇门里放汽车
guess = randint(1,3) #参赛者随机选一扇门
host = left(car,guess) #主持人从剩下的门(除了参赛者选的和汽车所在的)里选一扇门
change = left(host,guess) #参赛者看到主持人打开的门后的山羊,选择换成另一扇门
if change == car:
hits += 1 #假如猜中,猜中次数+1
P = hits/N # 猜中次数/模拟次数 = 换门后猜中的概率
print("换一扇门中奖的概率是{},不换中奖的概率是{}".format(P,1-P))
实验结果:
![](https://i-blog.csdnimg.cn/blog_migrate/f89b347e2a077145ff7ae534c775a691.png)
改变模拟次数多次重复实验,“换一扇门中奖的概率”均在2/3附近。
大家直接用python3运行这段代码,就可以重现这个结果。
实验结论:
就个人而言,这个结论从数学推理的角度并不能很自然的接受。因为这个结论是有些反直觉的,我的直觉觉得相当于两扇门选一扇,应该是1/2。所以概率课上推出这个结果的时候,我并不是真心觉得这个理论上的概率在真实世界是有效的。
因此当时模拟出结果的时候,有点震惊。
这个问题让我重新认识了数学和真实世界的关系。
此文也发布于https://www.zhihu.com/question/19825086/answer/371924991