python实验之蒙提·霍尔(Monty|python实验之蒙提·霍尔(Monty Hall)悖论游戏
【python实验之蒙提·霍尔(Monty|python实验之蒙提·霍尔(Monty Hall)悖论游戏】一、实验目的
了解蒙提霍尔悖论内容和游戏规则;熟练运用字典方法和集合运算;了解断言语句assert 的用法;熟练运用Python中的循环结构解决实际问题。
二、实验内容
假设你正在参加一个有奖游戏节目,你被要求在三扇门中选择一扇:其中一扇后面有一辆汽车;其余两扇后面则是山羊。你选择了一道门,假设是一号门,然后主持人(知道门后面有什么)选择并开启了另一扇后面有山羊的门,假设是三号门。这时,主持人问你:“你想选择二号门吗?”,然后根据你的选择确定最终要打开的门,并确定你获得山羊(输)或者汽车(赢)。转换你的选择对你来说是一种优势吗?
编写程序,模拟上面的游戏。
import randomdef product_things():
# 创建字典作为3扇门及其后面的物品
d = {}
# car number
tmp = random.randint(0, 2)
# thing to door
for i in range(3):
if i == tmp:
d['door' + str(i)] = 'car'
else:
d['door' + str(i)] = 'goat'
return ddef game():
door_and_thing = product_things()
car_number = list(door_and_thing.values()).index('car')
#print(car_number)
first_choose_number = int(input('Choose a door to open:'))
# 判断数字是否在0-2之间,否则异常
assert first_choose_number <= 2
assert first_choose_number >= 0
# 判断第一个选择的数字是不是car
if first_choose_number == car_number:# 是
# 输出out number,不等于car对应的值
while True:
out_number = random.randint(0, 2)
if out_number != car_number:
break
else:# 不是
# 输出另一个goat的数字
out_number = 3 - first_choose_number - car_number
# 主持人告诉一个山羊的位置
print('"goat" behind the door ' + str(out_number))
# 主持人询问是否换门
else_number = 3 - out_number - first_choose_number
choose_boolean = input('Switch to ' + str(else_number) + '?(y/n)')
if choose_boolean == 'y':
second_number = else_number
else:
second_number = first_choose_number
# 最终选择的门是否为car
if second_number == car_number:
print('You win!')
else:
print('You lost!')
returnwhile True:
print("=====================================")
game()
choose_continue = input('Do you want ti try once more?(y/n)')
if choose_continue == 'n':
break
文章图片
附:转换你的选择对你来说是一种优势吗?
我编写了一个程序,自动化实现了这个游戏,并得出了这个问题的答案。
import randomdef product_things():
# 创建字典作为3扇门及其后面的物品
d = {}
# car number
tmp = random.randint(0, 2)
# thing to door
for i in range(3):
if i == tmp:
d['door' + str(i)] = 'car'
else:
d['door' + str(i)] = 'goat'
return ddef game(tmp):
door_and_thing = product_things()
car_number = list(door_and_thing.values()).index('car')
#print(car_number)
#first_choose_number = int(input('Choose a door to open:'))
first_choose_number=random.randint(0,2)# 判断数字是否在0-2之间,否则异常
assert first_choose_number <= 2
assert first_choose_number >= 0
# 判断第一个选择的数字是不是car
if first_choose_number == car_number:# 是
# 输出out number,不等于car对应的值
while True:
out_number = random.randint(0, 2)
if out_number != car_number:
break
else:# 不是
# 输出另一个goat的数字
out_number = 3 - first_choose_number - car_number
# 主持人告诉一个山羊的位置
#print('"goat" behind the door ' + str(out_number))
# 主持人询问是否换门
else_number = 3 - out_number - first_choose_number
#choose_boolean = input('Switch to ' + str(else_number) + '?(y/n)')
choose_boolean = tmp
if choose_boolean == 'y':
second_number = else_number
else:
second_number = first_choose_number
# 最终选择的门是否为car
if second_number == car_number:
#print('You win!')
return True
else:
#print('You lost!')
return False
#returnsecceed = 0
falsed = 0
tmp=input("转换与否:input y or n ")
for i in range(100000):
result = game(tmp)
#print('Do you want ti try once more?(y/n)')
if result is True:
secceed += 1
elif result is False:
falsed += 1
print('成功率:')
print(secceed / (secceed + falsed))
#print((falsed / (secceed + falsed)))
文章图片
文章图片
推荐阅读
- python学习之|python学习之 实现QQ自动发送消息
- 逻辑回归的理解与python示例
- python自定义封装带颜色的logging模块
- 【Leetcode/Python】001-Two|【Leetcode/Python】001-Two Sum
- Python基础|Python基础 - 练习1
- Python爬虫|Python爬虫 --- 1.4 正则表达式(re库)
- 【学生作品】温暖的记忆
- Python(pathlib模块)
- python青少年编程比赛_第十一届蓝桥杯大赛青少年创意编程组比赛细则
- Python数据分析(一)(Matplotlib使用)