2015-07-03 55 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])? –