您的代碼有幾個問題。例如,您可以定義door
列表中的可能選項,但是您將path
傳遞給choice
函數。在程序結束時,您打印steps
,但這並未在任何地方定義。相反,您應該打印days
或days/1000
。編程時你需要注意類似的事情!
正如其他人所表明的那樣,您需要用兩個循環來做到這一點。外循環的每次迭代都會執行一次試驗。內部循環會選擇路徑,直到您回家並將日計數添加到當前總計。
在您的代碼中,每個if
測試會在循環開始時生成一個新的隨機選擇。那是不對的。只需在循環頂部進行選擇,確定要添加到計數的天數,並且如果您在家中,請跳出循環。
我們可以用更簡單的方法做到這一點。而不是從'a','b'或'c'中選擇,只需從1,2或3中選擇每個路徑所需的天數。正如我前面所說的那樣,不需要爲此使用Numpy,我們可以直接調用random
模塊函數,而不是讓Numpy代表我們執行它。
這是一個簡短的演示。
from random import randint
trials = 10000
days = 0
for n in range(trials):
while True:
path = randint(1, 3)
days += path
if path == 1:
break
print(days, days/trials)
典型輸出
59996 5.9996
我們可以得到通過進行多次運行和平均結果更準確地估計到真正的預期時間。我們可以通過將前面的代碼封裝在一個額外的循環中來做到這一點,但是如果我們將舊代碼封裝在一個函數中,並在循環中調用該函數,它會使代碼更具可讀性。就像這樣:
from random import randint
def sim(trials):
days = 0
for n in range(trials):
while True:
path = randint(1, 3)
days += path
if path == 1:
break
return days
num = 10
trials = 10000
total = 0
for i in range(num):
days = sim(trials)
x = days/trials
print(i, x)
total += x
print('Final', total/num)
典型輸出
0 5.9732
1 6.007
2 6.0555
3 5.9943
4 5.9964
5 5.9514
6 6.0689
7 6.0457
8 5.9859
9 5.9685
Final 6.00468
它看起來像真正的期望值爲6天。其實,數學表現並不難。
讓d等於預計回家的天數。我們有三分之一的時間在一天之內回家,其中三分之一的時間我們在兩天內回到起點,所以我們在回家之前還有d天,而我們回來的三分之一時間到3天開始,所以我們再次回到家前還有d天。
我們可以將它放入一個等式:
d = (1/3)*1 + (1/3)*(2 + d) + (1/3)*(3 + d)
3*d = 1 + 2 + d + 3 + d
3*d = 6 + 2*d
d = 6
打印 '階梯'? 'steps'在哪裏定義? 「路徑」在哪裏定義? – TessellatingHeckler
可愛的問題,但你爲什麼要用這個Numpy?只需直接調用'random'模塊函數即可。 –
如果其中一個答案解決了您的問題,您應該接受它(單擊相應答案旁邊的複選標記)。這有兩件事。它讓每個人都知道你的問題已經得到解決,讓你滿意,並且它可以幫助你幫助你。請參閱[此處](http://meta.stackexchange.com/a/5235)以獲取完整說明。 –