三门问题(问题来源于Crossin的编程教室)
三门问题(Monty Hall problem)亦称为蒙提霍尔问题、蒙特霍问题或蒙提霍尔悖论,大致出自美国的电视游戏节目 Let’s Make a Deal。问题名字来自该节目的主持人蒙提·霍尔(Monty Hall)。
参赛者会看见三扇关闭了的门,其中一扇的后面有一辆汽车,选中后面有车的那扇门可赢得该汽车,另外两扇门后面则各藏有一只山羊。当参赛者选定了一扇门,但未去开启它的时候,节目主持人开启剩下两扇门的其中一扇,露出其中一只山羊。主持人其后会问参赛者要不要换另一扇仍然关上的门。问题是:换另一扇门会否增加参赛者赢得汽车的机率?
问题解答:
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 = 100000
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('switch:',count_switch)
print('switch win:',win_switch,'%.2f%%'%(100*win_switch/count_switch))
print('stay:',count_stay)
print('stay win:',win_stay,'%.2f%%'%(100*win_stay/count_stay))