【问题标题】:MONTY HALL SIMULATION: Why are these 2 versions of my code giving different output?蒙蒂霍尔模拟:为什么我的代码的这两个版本给出不同的输出?
【发布时间】:2021-03-29 09:14:32
【问题描述】:

在展示我的蒙蒂霍尔问题模拟的两个不同版本之前:

+如果这是您第一次听说蒙蒂霍尔问题,您可以在这里找到:https://www.youtube.com/watch?fbclid=IwAR35Ar6wrCtU-kxvqhFEvYm1ERhqI24iSzz5nZOwXfhBF1iPZn6ZlNaO1Vw&v=iBdjqtR2iK4&feature=youtu.be

https://en.wikipedia.org/wiki/Monty_Hall_problem

蒙蒂霍尔问题是一个著名的概率难题,它以假设游戏节目的形式出现。参赛者获得三扇门;一个后面是一辆汽车,另外两个后面是一只山羊。参赛者选择一扇门,然后游戏节目主持人打开另一扇门,露出一只山羊。主人知道哪扇门隐藏着汽车。然后邀请参赛者切换到另一扇关闭的门或坚持他们最初的选择。

也许与直觉相反,赢得赛车的最佳策略是换车,如下面的模拟所示。

+这是模拟问题的正确示例代码https://matthew-brett.github.io/dsfe/chapters/extra/monty_hall_lists

所以,我自己写了 2 个不同的版本来模拟这个问题。

我的程序的输出是参赛者在每个案例中选择切换时赢得汽车的次数。

第一个版本,给出正确的输出(~67):

import random
count = 0
n = 100
##n is number of test case
i = 0
while i<n:
  list1 = ["goat","goat","goat"]
  prize = random.randint(0,2)
  list1[prize] = "Car"
  choose = random.randint(0,2)
  while True:
    opendoor = random.randint(0,2)
    if (opendoor!=choose and list1[opendoor]!="Car"):
      break
  i+=1
  choose = 3- opendoor - choose
  if list1[choose]=="Car":
    count+=1
print(count)

第二个版本,输出错误(~50):

import random
count = 0
n = 100
##n is number of test case
i = 0
while i<n:
  list1 = ["goat","goat","goat"]
  prize = random.randint(0,2)
  list1[prize] = "Car"
  choose = random.randint(0,2)
  while True:
    opendoor = random.randint(0,2)
    if (opendoor!=choose):
      break
  if (list1[opendoor]!="Car"):
    i+=1
    choose=3-opendoor-choose
    if list1[choose]=="Car":
      count+=1
print(count)

基本上,它们产生相同数量的循环,并且所有的数字也是随机产生的。但我不明白为什么输出如此不同。

我知道第二个程序将消除list1[open]=="Car" 的所有情况。但是,它仍然会生成一个新循环。我知道这可能会影响结果。我正在寻找的答案是对这个问题的数学解释。

所以,再一次。能否请您从数学或逻辑上解释为什么会发生这种情况?

【问题讨论】:

  • 在第二种情况下,您似乎并没有阻止打开车门。如果您解决了这个问题,是否可以解决问题?
  • 顺便说一句,不要使用open 作为变量的名称。它已经被用作内置的。
  • 好的,所以我会改为“opendoor”,但我担心的是:我知道第二个程序会消除 list1[open]=="Car" 的所有情况。但是,它仍然会生成一个新循环。我知道这可能会影响结果。我正在寻找的答案是对这个问题的数学解释。所以,再一次。您能否从数学或逻辑上解释为什么会发生这种情况?
  • 您是否有理由不能追踪所有可能的执行?这是可以在纸上解决的问题。

标签: python loops random conditional-statements


【解决方案1】:

假设您只想进行一次有效试验,这意味着您的变量 i 必须等于 1。

在第一个代码中,如果在第一个选择中选择的门有一只山羊,则保证打开的门将是有另一只山羊的门,因此游戏将被视为有效,同时添加一个+ 1 切换策略。

在第二个代码中,如果在第一个选择中选择的门有山羊,则游戏有可能被丢弃,因为打开的门可能有汽车。所以,一开始选择山羊门并不意味着切换策略+1。仍然可能会发生必须重复游戏的情况,因此在新的试验中,您会在第一个选择中获得车门,这是一场坚持获胜的游戏。所以,你添加了通过留下来取胜的方式,而那些通过转换取胜的方式被淘汰了。

当您多次尝试此操作时,您最终会丢弃一些您可以通过切换赢得的游戏,并将它们替换为您通过留下来赢得的游戏。您将数字减去策略并将它们添加到另一个。

【讨论】:

    最近更新 更多