【问题标题】:Monty Hall simulator has a wrong outcomeMonty Hall 模拟器的结果错误
【发布时间】:2017-05-15 19:57:14
【问题描述】:

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

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)

【问题讨论】:

  • 你为什么有try/except?为什么门不在removable_doors
  • av_doors 应该代表什么?
  • 您实际上并没有在任何地方使用removable_doors 的内容。
  • 至于 try/except,如果玩家选择了 1(或任何门 x)并且 1 (x) 被赋值为 1,则它不会在 removed_doors 中。
  • 您的主人有时会展示汽车而不是山羊。

标签: python python-3.x math


【解决方案1】:

你的主人有时会移除一扇门,后面有车......这是一个可行的解决方案,并且(我认为)写得更好,同时保持你的结构(在 python3 中,但这不应该引起麻烦):

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)))

switch=False 时,它给了我0.33320.6738switch=True,我想这更证实了Monty Hall 的解决方案:)

【讨论】:

  • @Adam Karolczak 这能回答你的问题吗?如果是这样,请您将其标记为这样吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多