这是代码
from random import *
a=10000
s=0
for i in range(a):
初始=[0,1,2] #0代表汽车,1,2 代表空门
主持人=[1,2] #主持人从未选择过的空门中随机选一个打开
第一次=choice(初始) #选手选门
if 第一次 in 主持人:
主持人.remove(第一次)
else:
pass
第二次=choice(主持人) #主持人翻门并让选手换门
初始.remove(第二次)
最终=choice(初始)
if 最终==0: #如果翻到汽车则统计一次
s=s+1
else:
pass
print(s/a*100) #翻到汽车的概率
初始=[0,1,2] #0代表汽车,1,2 代表空门
主持人=[1,2] #主持人从未选择过的空门中随机选一个打开
第一次=choice(初始) #选手选门 3选1
if 第一次 in 主持人: #第一次有 2/3 概率 在 主持人 中
主持人.remove(第一次) #
else:
pass
第二次=choice(主持人) #主持人 中有 2/3 概率是 1 个值,1/3 概率是 2 个值
初始.remove(第二次) #主持人中没有0,初始中移除的只可能是1或2,
最终=choice(初始) #初始移除后只有[0,1]或者[0,2]两种结果,这两种结果都有0,都是两个值
if 最终==0: #最终从两个值中2选1 选中0的概率自然是 50%
s=s+1
else:
pass
三门问题计算的是选手在首次作出选择后,主持人打开剩余的一个空门,选手决定换门得到汽车的概率有多高,而题主的代码却是在模拟游戏的过程,并没有实现“选手总是选择换门”这个关键点,因此得不到2/3的期望值。这是我写的代码,请参考。
>>> import random
>>> def monty_hall_problem(n):
s = 0 # 选手赢得汽车的次数
for i in range(n): # 模拟n次实验
gates = [1, 0, 0] # 三门,1表示有车
if not random.choice(gates): # 如果选手第1次选择了无车的门
s += 1 # 主持人打开剩余的任意一个空门,选择换门则必中
# else 如果选手第1次选择了有车的门,选择换门则必不中,因此不予统计
print('选手第2次选择换门中奖的概率为%.02f%%'%(100*s/n))
>>> monty_hall_problem(10000)
选手第2次选择换门中奖的概率为65.86%
>>> monty_hall_problem(100000)
选手第2次选择换门中奖的概率为66.73%
您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632
非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!
速戳参与调研>>>https://t.csdnimg.cn/Kf0y