2015-07-03 57 views
0

所以我正在模拟Python中的monty hall问题,并且我从Harvad Stats 111课程中获得了解决方案。下面的功能应该显示一个不是奖品门或猜门的门。但是,我对这两个函数的功能是做什么感到困惑。首先,bad.any()是做什么的,为什么它是必要的。仅仅说“如果不坏”是不够的。其次,最后一行到底是什么。Monty Hall Python模拟

非常感谢

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 
+1

*“仅仅说'如果不坏'就足够了” - 试试看! – jonrsharpe

+1

请注意,这是使用'numpy',并不是Python中的标准行为;你不能仅仅将一个值与一个正常的迭代进行比较,并得到一个可迭代的结果。 – Sam

+0

'如果不是bad.any()'则更易读为'if bad.all()'。也许编写代码的人认为'not bad.any()'由于短路会更快,但这显然是一种微型优化! – YXD

回答

0

当您使用numpy.ndarray(numpy的阵列)平等的运营商,他们给它包含数组的每个元素的平等(比如在返回第一个元素布尔值的列表阵列是两个阵列的第一个元素的相等性。

|是,它是用来逐位按位或在python操作者或由两个相等比较返回的两个真阵列,使得其在ith索引如果返回true其Trueith索引为任何数组获取作为其操作数。

现在bad是一个布尔值的数组,试图直接做if not bad是行不通的,因为它总是返回True,坏是一个数组(和任何非零/无Python中值为true(在python 2.x即是))。

所以你要做的bad.any()用来检查是否任何bad数组中的元素是真实的,如果是则返回True,否则返回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中有一个真实的元素。

+0

很抱歉挖掘这个话题,但我想知道是否可以将bad.sum()更改为len(result [bad])? –