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 索引处为真,如果它的 Trueith 索引处对于它作为操作数获取的任何数组。

现在 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 中有一个正确的元素。