三门问题(Monty Hall Problem)是概率统计中的一个著名的问题,原问题大概如此:
Monty Hall是美国电视节目的主持人,在这个节目中,有一个给嘉宾开奖的环节,开奖的环节是这样的:现在一共有三扇门,其中有一扇门背后是一辆汽车,另外两扇门背后是山羊。现在嘉宾可以选择一扇门,此时主持人会打开另外两扇门中一扇背后是山羊的门,然后会问嘉宾是否要更换之前的选择。嘉宾选择更换或不更换后,主持人会开启嘉宾最终选择的那一扇门,假如开启之后是一辆汽车的话,那么就会将汽车送给嘉宾。
在这个问题中,看似换与不换的概率都是不变的,都是1/3。但是实际上更换选择后能够得到汽车的概率是2/3,不更换选择能够得到汽车的概率是1/3。这个问题的解释方法有很多种,比较严谨的方法是利用贝叶斯公式,概率论中的解释此处不再加以赘述。用python模拟一些,看了下别人的代码不够简洁故在别人的代码上写了一个简洁的。毕竟人生苦短我用python!用python还不简洁是对python的侮辱。
import random
def do_monty_hall (determine):
doordic={'door1':0,'door2':0,'door3':0}
doorlist=list(doordic.keys())
carchoise=random.choice(doorlist)
doordic[carchoise]=1
youchoise=random.choice(doorlist)
#下面打开一个有山羊的们 这个和结果没有关系 结果只决定与你的初始选择和你要不要换选择
if youchoise==carchoise:
if determine==1:
return 0
else:
return 1
else:
if determine==1:
return 1
else:
return 0
if __name__ == '__main__' :
n = int(input('请输入要做三门问题的次数:'))
right_time1 = 0
right_time2 = 0
k = 1
while k <= n:
right_time1 += do_monty_hall(1)
right_time2 += do_monty_hall(0)
k+=1
print('若换,做%d次实验,开启正确的门的频率是%f\n'%(n,(right_time1/n)))
print('若不换,做%d次实验,开启正确的门的频率是%f\n'%(n,(right_time2/n)))