三门问题(Monty Hall problem)亦称为蒙提霍尔问题、蒙特霍问题或蒙提霍尔悖论,大致出自美国的电视游戏节目 Let’s Make a Deal。问题名字来自该节目的主持人蒙提·霍尔(Monty Hall)。
参赛者会看见三扇关闭了的门,其中一扇的后面有一辆汽车,选中后面有车的那扇门可赢得该汽车,另外两扇门后面则各藏有一只山羊。
当参赛者选定了一扇门,但未去开启它的时候,节目主持人开启剩下两扇门的其中一扇,露出其中一只山羊(主持人肯定会开一扇有羊的门)。主持人其后会问参赛者要不要换另一扇仍然关上的门。
问题是:换另一扇门会否增加参赛者赢得汽车的机率?
1.直观理解
这时主持人会在后两扇门中打开一扇有山羊的门,也就是后面的2/3中又有一扇门被确定了

那么此时的2/3的概率会收缩到最后一扇门上,所以在后一扇门上的出现汽车的概率(2/3)会大于第一扇门。
所以换门会提高获得汽车概率
我们不妨把3个门的情况推广到100个门的情况,这时候理解起来会更直观。
此时还是应该换门。
2.列举
我们列举获得汽车的情况
第一种情况:汽车就在你一开始选的门后
此时不换门,汽车就是你的!!!

第二种情况:汽车在第二扇门后
主持人会帮你开第三扇门(他总是会给你开有羊的门)
此时你换门,汽车才是你的
.
第三种情况:汽车在第三扇门后
主持人会帮你开第二扇门
综上,换门获得汽车的概率为2/3,而不换门得到汽车的概率是1/3。
3.用python来验证
首先是不换门的方法stay():
def stay(): doors = ['car','goat','goat'] #设置三扇门,其中两扇门后面是山羊,一扇门后是汽车 choose = choice(doors) #随机选择一扇门 if choose == 'car': #不换门则直接判断 return 'win' else: return 'lose'
也就是不换门就会选到汽车的情况。
然后是换门的方法switch():
def switch(): doors = ['car', 'goat', 'goat'] choose = choice(doors) doors.remove(choose) #选择的门放一边 doors.remove('goat') #剩下的门,去掉一只山羊 if doors == ['car']: #换门 return 'win' else: return 'lose'
换门后会选到汽车的情况。
完整代码
from random import choice def stay(): doors = ['car','goat','goat'] #设置三扇门,其中两扇门后面是山羊,一扇门后是汽车 choose = choice(doors) #随机选择一扇门 if choose == 'car': #不换门则直接判断 return 'win' else: return 'lose' def switch(): doors = ['car', 'goat', 'goat'] choose = choice(doors) doors.remove(choose) #选择的门放一边 doors.remove('goat') #剩下的门,去掉一只山羊 if doors == ['car']: #换门 return 'win' else: return 'lose' if __name__ == '__main__': total = count_switch = 0 win_switch = 0 count_stay = 0 win_stay = 0 for i in range(total): choose = choice([1,2]) #随机选择换门还是不换门 if choose == 1: count_switch += 1 if switch() == 'win': win_switch += 1 else: count_stay += 1 if stay() == 'win': win_stay += 1 print('换门次数:',count_switch) print('换门后得到汽车:',win_switch,'%.2f%%'%(100*win_switch/count_switch)) print('不换门:',count_stay) print('不换门后得到汽车:',win_stay,'%.2f%%'%(100*win_stay/count_stay))
运行情况:

由此也可以验证我们上面说的换门后获得汽车的概率为2/3的说法。
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/230291.html原文链接:https://javaforall.net
