本文最后更新于 198 天前,其中的信息可能已经有所发展或是发生改变。
题目简介:
· 参赛者在三扇门(两🐏一🚗)中挑选一扇(最后门后是🚗,参赛者获胜)。他并不知道内里有什么。
· 主持人知道每扇门后面有什么。
· 主持人必须开启剩下的其中一扇门,并且必须提供换门的机会。
· 主持人永远都会挑一扇有山羊的门。
o 如果参赛者挑了一扇有山羊的门,主持人必须挑另一扇有山羊的门。
o 如果参赛者挑了一扇有汽车的门,主持人随机(概率均匀分布)在另外两扇门中挑一扇有山羊的门。
· 参赛者会被问是否保持他的原来选择,还是转而选择剩下的那一道门。
题目解析:
有三种可能的情况:
· 参赛者挑汽车,主持人挑两头羊的任何一头。转换将失败。
· 参赛者挑A羊,主持人挑B羊。转换将赢得汽车。
· 参赛者挑B羊,主持人挑A羊。转换将赢得汽车。
在游戏方面来看,选择转换,转换后获胜的概论是2/3.
代码部分:
from random import randrange
from socket import MsgFlag
from unittest import result
def init():
#返回一个字典,键为3个门号,值为门号后面的物品
result = {i: 'goat' for i in range(1,4)}
r = randrange(1,4) #nn nrandrange() 方法返回指定递增基数集合中的一个随机数,基数默认值为1。
result[r] = 'car'
return result
def starGame():
#获取本次游戏中每个门的情况
doors = init()
#print(doors)
#获取玩家选择的门号
while True:
try:
firstDoorNum = int(input('Choose a door to open:'))
assert 1 <= firstDoorNum <= 3
break
except:
print('Door number must be between 1-3') # format() 方法格式化指定的值,并将其插入字符串的占位符内。
#主持人查看另外两个门后面的物品情况
for door in doors.keys()-{firstDoorNum}:
#打开其中一个后面为山羊的门
if doors[door] == 'goat':
print('"goat"behind the door', door)
#获取第三个门号,让玩家纠结
thirdDoor = (doors.keys()-{door, firstDoorNum}).pop()
msg = 'Do you want to switch to {} ?(y/n)'.format(thirdDoor)
change = input(msg)
if change == 'y':
finalDoorNum = thirdDoor
else:
finalDoorNum = firstDoorNum
if doors[finalDoorNum] == 'goat':
return 'I Win !'
else:
return 'You Win ! '
print(starGame())