关于三门问题概率的计算,为什么最后输出的是50%?

这是代码

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