Monty Hall Python 模拟
Monty Hall Python Simulation
所以我在python中模拟monty hall问题,并从Harvad Stats 111课程中获得了解决方案。下面的函数应该显示一个不是奖品门或猜测门的门。但是,我对函数的两个部分的作用感到困惑。首先,bad.any() 做什么,为什么有必要。光说"if not bad"还不够吗?其次,最后一行到底实现了什么。
非常感谢
def goat_door(prizedoors, guesses):
#strategy: generate random answers, and
#keep updating until they satisfy the rule
#that they aren't a prizedoor or a guess
result = np.random.randint(0, 3, prizedoors.size)
while True:
bad = (result == prizedoors) | (result == guesses)
if not bad.any(): #DON'T UNDERSTAND THIS
return result
result[bad] = np.random.randint(0, 3, bad.sum()) #DON'T UNDERSTAND THIS
当您在 numpy.ndarray
(numpy 数组)上使用相等运算符时,它们会给出一个布尔值列表,其中包含数组中每个元素的相等性(例如 return 数组中的第一个元素是两个数组的第一个元素相等。
|
是python中的按位或运算符,用于对两次相等比较return的两个真值数组进行按位或,使得return 在 ith
索引处为真,如果它的 True
在 ith
索引处对于它作为操作数获取的任何数组。
现在 bad
是一个布尔值数组,试图直接做 if not bad
是行不通的,因为它总是 return 真,因为数组不好(和任何non-zero/None 中的值 python 为真(在 python 2.x 中))。
所以你必须做 bad.any()
检查 bad
数组中的任何元素是否为 True,如果是则 returns True
,否则它 returns False
.
例子-
import numpy as np
import numpy.random as rn
n1 = np.arange(0,10)
n2 = np.arange(5,15)
rn.shuffle(n1)
rn.shuffle(n2)
print(n1)
>>> [8 2 3 7 9 5 0 6 1 4]
print(n2)
>>> [ 8 5 14 12 13 7 10 11 6 9]
d = n1 == n2
print(d)
>>> [ True False False False False False False False False False]
如您所见,d
是一个布尔值数组。
print(d.any())
>>> True
这是正确的,因为 d
中有一个正确的元素。
所以我在python中模拟monty hall问题,并从Harvad Stats 111课程中获得了解决方案。下面的函数应该显示一个不是奖品门或猜测门的门。但是,我对函数的两个部分的作用感到困惑。首先,bad.any() 做什么,为什么有必要。光说"if not bad"还不够吗?其次,最后一行到底实现了什么。
非常感谢
def goat_door(prizedoors, guesses):
#strategy: generate random answers, and
#keep updating until they satisfy the rule
#that they aren't a prizedoor or a guess
result = np.random.randint(0, 3, prizedoors.size)
while True:
bad = (result == prizedoors) | (result == guesses)
if not bad.any(): #DON'T UNDERSTAND THIS
return result
result[bad] = np.random.randint(0, 3, bad.sum()) #DON'T UNDERSTAND THIS
当您在 numpy.ndarray
(numpy 数组)上使用相等运算符时,它们会给出一个布尔值列表,其中包含数组中每个元素的相等性(例如 return 数组中的第一个元素是两个数组的第一个元素相等。
|
是python中的按位或运算符,用于对两次相等比较return的两个真值数组进行按位或,使得return 在 ith
索引处为真,如果它的 True
在 ith
索引处对于它作为操作数获取的任何数组。
现在 bad
是一个布尔值数组,试图直接做 if not bad
是行不通的,因为它总是 return 真,因为数组不好(和任何non-zero/None 中的值 python 为真(在 python 2.x 中))。
所以你必须做 bad.any()
检查 bad
数组中的任何元素是否为 True,如果是则 returns True
,否则它 returns False
.
例子-
import numpy as np
import numpy.random as rn
n1 = np.arange(0,10)
n2 = np.arange(5,15)
rn.shuffle(n1)
rn.shuffle(n2)
print(n1)
>>> [8 2 3 7 9 5 0 6 1 4]
print(n2)
>>> [ 8 5 14 12 13 7 10 11 6 9]
d = n1 == n2
print(d)
>>> [ True False False False False False False False False False]
如您所见,d
是一个布尔值数组。
print(d.any())
>>> True
这是正确的,因为 d
中有一个正确的元素。