2017-09-24 116 views
0

我正在使用Python 3.我的代碼嘗試在3維中模擬random walk的N個步驟。在每個步驟中,選擇一個隨機方向(北,南,東,西,上,下),每個方向有1/6的概率,並在該方向上採用大小爲1的步驟。然後打印新的位置。起始位置是原點(0,0)。在Python中模擬隨機遊走

即使沒有錯誤消息,代碼也不起作用。我們應該移動只有一步x,y或z。然而,在結果中,我發現有時候我根本不動,有時候我會向一個以上的方向移動。

這裏是我的代碼:

import random 

N = 30 

n = random.random() 

x = 0 
y = 0 
z = 0 
count = 0 

while count <= N: 

    if n < 1/6: 
     x = x + 1   
     n = random.random() 
    if n >= 1/6 and n < 2/6: 
     y = y + 1   
     n = random.random() 
    if n >= 2/6 and n < 3/6: 
     z = z + 1   
     n = random.random() 
    if n >= 3/6 and n < 4/6: 
     x = x - 1   
     n = random.random() 
    if n >= 4/6 and n < 5/6: 
     y = y - 1   
     n = random.random() 
    if n >= 5/6: 
     z = z - 1   
     n = random.random() 

    print("(%d,%d,%d)" % (x,y,z)) 
    count = count + 1 

print("squared distance = %d" % (x*x + y*y + z*z)) 

你怎麼認爲我可以解決這一問題?

非常感謝。

+0

你使用Python 2或3嗎? –

回答

3

您應該使用elif而不是如此多的ifs。每次評估if時,n的值都會發生變化,然後可能有資格獲得下一個if。

2

你不僅應該使用elif,即使是性能,但你並不需要在循環的多個n = random.random()語句 - 一個會做:

import random 

N = 30 

x = 0 
y = 0 
z = 0 

for _ in range(N): 

    n = random.random() 

    if n < 1/6: 
     x += 1 
    elif 1/6 <= n < 2/6: 
     y += 1 
    elif 2/6 <= n < 3/6: 
     z += 1 
    elif 3/6 <= n < 4/6: 
     x -= 1 
    elif 4/6 <= n < 5/6: 
     y -= 1 
    elif n >= 5/6: 
     z -= 1 

    print(f"({x},{y},{z})") # python 3.6ism 

print("squared distance = {}".format(x*x + y*y + z*z)) 
0

不管的Python版本您使用,你需要實現@cdlane提供的答案。

如果您使用的是Python 2.X,那麼您的其他問題是Python將您的數字解釋爲ints。爲了解決這個問題,你需要添加.分母即

if n < 1/6.:

,而不是

if n < 1/6:

1/6和其它部分被解釋爲ints - 通過鍵入print 1/6你可以自己去查這將給你0或打印實際類型print type(1/6) - 這將產生<type 'int'>

正因爲如此,當你運行你的程序時,所有的ns只會滿足最後一個條件(全部會大於0)。

+1

考慮到我們所看到的行爲,實際上可能並非如此。他們可能使用Python 3,其中1/6用float division進行評估。如果這是整數除法,則每個循環都會將z減1並且不會改變其他值。 –

+0

@Jeremy McGibbon如果沒有幫助,我會將其刪除 - 爲我的工作如同一個魅力(在Python 2.7上) - 爲整個問題進行測試。 – atru

+0

這個改變對我沒有幫助,在Python 3.5上測試過。確保你沒有得到任何兩個數字改變的行(例如'(-7,-2,2)'到'(-7,-1,1)'。 –