【发布时间】: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