Python 蒙蒂霍尔模拟器的结果是错误的

Python 蒙蒂霍尔模拟器的结果是错误的,python,python-3.x,math,Python,Python 3.x,Math,我想做一些看似简单的事情,同时用代码证明Monty Hall,可悲的是,我得到的不是问题的证明,而是完全相反的证明。无论我是否切换,我都有33%的几率在10000次模拟中获胜。你能检查一下代码,看看有什么问题吗?请记住,我是一名web开发人员,因此我的Python技能不太好,代码看起来也不太好(例如,我制作了一个可移动的doors列表,其中只有一个变量就可以很好地工作)。干杯 随机导入 av_门=[1,2,3] 门v=[1,2,3] 可拆卸门=[1,2,3] 分数=0 损失=0 门=int(输入

我想做一些看似简单的事情,同时用代码证明Monty Hall,可悲的是,我得到的不是问题的证明,而是完全相反的证明。无论我是否切换,我都有33%的几率在10000次模拟中获胜。你能检查一下代码,看看有什么问题吗?请记住,我是一名web开发人员,因此我的Python技能不太好,代码看起来也不太好(例如,我制作了一个可移动的doors列表,其中只有一个变量就可以很好地工作)。干杯

随机导入
av_门=[1,2,3]
门v=[1,2,3]
可拆卸门=[1,2,3]
分数=0
损失=0
门=int(输入(“选择你的门(1-3)”)
拾取=内部(门)-1
dec=输入(“保持或切换?(0/1)”)
n=0
当n<10000时:
可拆卸门=[1,2,3]
av_门=[1,2,3]
val=random.randint(1,3)
如果val==1:
门v[0]=1
门v[1]=0
门v[2]=0
可拆卸门。拆卸(1)
elif val==2:
门v[0]=0
门v[1]=1
门v[2]=0
可拆卸门。拆卸(2)
elif val==3:
门v[0]=0
门v[1]=0
门v[2]=1
可拆卸门。拆卸(3)
尝试:
可拆卸门。拆卸(内部(门))
除:
通过
视听门。拆卸(门)
如果len(可拆卸门)=2:
rand_door=random.randint(0,1)
如果rand_door==0:
del av_门[0]
elif rand_door==1:
del av_门[1]
其他:
del av_门[0]
如果dec==“1”:
门=自动门[0]
其他:
通过
拾取=门-1
如果门v[pick]==1:
分数+=1
其他:
损失+=1
n+=1
打印(分数)
打印(丢失)

你的主人有时会搬开一扇门,后面有一辆车。。。这是一个有效的解决方案,而且(我认为)写得更好,同时保持您的结构(在python3中,但这不会带来麻烦):

随机导入
赢=0
损失=0
开关=int(输入(“保持或开关”(0-保持/1-开关):”)=1
n=0
当n<10000时:
#初始化
门_值=[0,0,0]
可拆卸门=[0,1,2]
可用门=[0,1,2]
#把奖赏放在某处
car_place=random.randint(0,2)
门值[轿厢位置]=1
可拆卸车门。拆卸(轿厢位置)
#选一扇门
选择的门=随机。随机数(0,2)
可用门。移除(选择门)
如果选择了门_!=车位:
可拆卸门。拆卸(选择门)
#主人移除了一扇没有车的门,并且玩家没有选择它
门被主机移除=可移动门[random.randint(0,len(可移动门)-1]
可用的门。移除(门由主机移除)
#开关(如果指定)
如果开关:
断言(len(可用门)==1)
选择的门=可用的门[0]
#检查结果
如果选择了轿厢位置==门位置:
赢+=1
其他:
损失+=1
n+=1
打印('win=%s'%str(win))
打印('lose=%s'%str(lose))
打印('ratio=%s'%str(赢/(赢+输)))

它给了我
0.3332
switch=False
时,
0.6738
对于
switch=True
,我想这相当证实了Monty Hall的解决方案:)

为什么你有一个
尝试/除了
?为什么门不在
可移动门中
?什么是
av\u门
应该代表的?你实际上没有在任何地方使用
可移动门的内容。至于try/except,如果玩家选择1(或任何门x)和1(x),它不会在可移动门中分配的值为1。你的主人有时会展示汽车而不是山羊。@Adam Karolczak这回答了你的问题吗?如果是这样的话,你能把它标成这样吗?
import random
av_doors = [1, 2, 3]
door_v = [1, 2, 3]
removable_doors = [1, 2, 3]
score = 0
loses = 0

door = int(input("Choose your door (1-3)"))
pick = int(door)-1

dec = input("Stay or switch? (0/1)")

n = 0
while n < 10000:
    removable_doors = [1, 2, 3]
    av_doors = [1, 2, 3]
    val = random.randint(1,3)
    if val == 1:
        door_v[0] = 1
        door_v[1] = 0
        door_v[2] = 0
        removable_doors.remove(1)
    elif val == 2:
        door_v[0] = 0
        door_v[1] = 1
        door_v[2] = 0
        removable_doors.remove(2)
    elif val == 3:
        door_v[0] = 0
        door_v[1] = 0
        door_v[2] = 1
        removable_doors.remove(3)

    try:
        removable_doors.remove(int(door))
    except:
        pass

    av_doors.remove(door)

    if len(removable_doors) == 2:
        rand_door = random.randint(0,1)
        if rand_door == 0:
            del av_doors[0]
        elif rand_door ==1:
            del av_doors[1]
    else:
        del av_doors[0]

    if dec == "1":   
        door = av_doors[0]
    else:
        pass

    pick = door-1
    if door_v[pick] == 1:
        score+=1
    else:
        loses+=1

    n+=1

print(score)
print(loses)
import random

win = 0
lose = 0

switch = int(input("Stay or switch? (0-stay/1-switch):")) == 1

n = 0
while n < 10000:
    # Init
    door_values = [0, 0, 0]
    removable_doors = [0, 1, 2]
    available_doors = [0, 1, 2]

    # Placing the reward somewhere
    car_place = random.randint(0, 2)
    door_values[car_place] = 1
    removable_doors.remove(car_place)

    # Choose a door
    door_chosen = random.randint(0, 2)
    available_doors.remove(door_chosen)
    if door_chosen != car_place:
        removable_doors.remove(door_chosen)

    # Host removes a door that does not have the car and has not been chosen by the player

    door_removed_by_host = removable_doors[random.randint(0, len(removable_doors)-1)]
    available_doors.remove(door_removed_by_host)

    # Switch if specified
    if switch:
        assert(len(available_doors) == 1)
        door_chosen = available_doors[0]

    # Check the result
    if car_place == door_chosen:
        win += 1
    else:
        lose += 1

    n+=1

print('win=%s'%str(win))
print('lose=%s'%str(lose))
print('ratio=%s'%str(win/(win+lose)))