实验:模拟蒙提霍尔悖论游戏 本实验还是非常简单的,主要是对字典中键和值的类型转换有点麻烦,游戏主体部分可能有些笨重,欢迎喷我~~
文章目录
- 一、蒙提·霍尔悖论
- 二、游戏实现
- 1.生成初始化的三扇门以及门后面的物品。
- 2.实现游戏的主体部分
- 3.利用while循环,调用函数,进行游戏。
- 三、源代码
一、蒙提·霍尔悖论
蒙提霍尔悖论亦称为蒙提霍尔问题、蒙特霍问题或蒙提霍尔悖论、三门问题(Monty Hall problem)。
三门问题(Monty Hall problem),是一个源自博弈论的数学游戏问题,大致出自美国的电视游戏节目Let’s Make a Deal。问题的名字来自该节目的主持人蒙提·霍尔(Monty Hall)。
这个游戏的玩法是:参赛者会看见三扇关闭了的门,其中一扇的后面有一辆汽车,选中后面有车的那扇门就可以赢得该汽车,而另外两扇门后面则各藏有一只山羊。当参赛者选定了一扇门,但未去开启它的时候,节目主持人会开启剩下两扇门的其中一扇,露出其中一只山羊。主持人其后会问参赛者要不要换另一扇仍然关上的门。问题是:换另一扇门会否增加参赛者赢得汽车的机会率?如果严格按照上述的条件的话,答案是会—换门的话,赢得汽车的机会率是 2/3。
这条问题亦被叫做蒙提霍尔悖论:虽然该问题的答案在逻辑上并不自相矛盾,但十分违反直觉。这问题曾引起一阵热烈的讨论。
二、游戏实现
1.生成初始化的三扇门以及门后面的物品。
三扇门分别用0,1,2来编号。
由门和礼物的对应关系想到用字典的键值对来存储,但是要随机组合的话,字典是没有这种功能的,而列表有一个打乱列表内元素顺序的方法random.shuffle (lst ),
这就需要先把门和礼物先存储到列表中,然后zip组合。
注意:shuffle()函数是没有返回值的,执行之后原列表lst中的元素直接被打乱。
def initialize_game():
doors = [0,1,2]
gifts = ['goat1','goat2','car']
random.shuffle(doors)
random.shuffle(gifts)
dic = dict(zip(doors,gifts))
# print(dic)
return dic
initialize_game()
输出:
2.实现游戏的主体部分
def game_body(dictionary):
print('===================================')
'''
选手选择第一扇门
'''
first_key = input('Choose a door to open:')
first_value = dictionary[int(first_key)]
# print(first_value)
'''
主持人打开有goat的一扇门
'''
del[dictionary[int(first_key)]]
# print(dictionary)
goat_key = list(dictionary.keys())[list(dictionary.values()).index('goat')]
print('"goat" behind the door '+str(goat_key))
'''
选手选择是否更换为第三扇门
'''
del[dictionary[int(goat_key)]]
# print(dictionary)
second_key = dictionary.keys()
# print(list(second_key)[0])
choice = input('Switch to '+str(list(second_key)[0])+'?(y/n)')
if(choice == 'y'):
second_value = dictionary[list(second_key)[0]]
if(second_value == 'car'):
print('You Win!')
else:
print('You Lose!')
if(choice == 'n'):
if(first_value == 'car'):
print('You Win!')
else:
print('You Lose!')
return
3.利用while循环,调用函数,进行游戏。
game_body(game_initialize())
while(input('Do you want to try once more?(y/n)') == 'y'):
game_body(game_initialize())
测试:
三、源代码
import random
doors = [0,1,2]
gifts = ['goat','goat','car']
def game_initialize():
random.shuffle(doors)
random.shuffle(gifts)
dic = dict(zip(doors,gifts))
# print(dic)
return dic
# game_initialize()
def game_body(dictionary):
print('===================================')
'''
选手选择第一扇门
'''
first_key = input('Choose a door to open:')
first_value = dictionary[int(first_key)]
# print(first_value)
'''
主持人打开有goat的一扇门
'''
del[dictionary[int(first_key)]]
# print(dictionary)
goat_key = list(dictionary.keys())[list(dictionary.values()).index('goat')]
print('"goat" behind the door '+str(goat_key))
'''
选手选择是否更换为第三扇门
'''
del[dictionary[int(goat_key)]]
# print(dictionary)
second_key = dictionary.keys()
# print(list(second_key)[0])
choice = input('Switch to '+str(list(second_key)[0])+'?(y/n)')
if(choice == 'y'):
second_value = dictionary[list(second_key)[0]]
if(second_value == 'car'):
print('You Win!')
else:
print('You Lose!')
if(choice == 'n'):
if(first_value == 'car'):
print('You Win!')
else:
print('You Lose!')
return
game_body(game_initialize())
while(input('Do you want to try once more?(y/n)') == 'y'):
game_body(game_initialize())