2016-09-20 119 views
-2

我剛開始學習python,並有一個問題,打印一個新的位置隨機遊走三維。彈出沒有錯誤,但顯然輸出(x,y,z)被打印是不合理的!在逐步模擬隨機遊走時,我假設每次只改變(x,y,z)中的一個值。但它似乎不在輸出中。我試圖調試它,但仍然困惑於確定真正的問題是什麼。在python 3中隨機遊走的奇怪結果?

輸出的頭行:

(0,-1,1) 
(-1,0,1) 
(-2,0,1) 
(-2,1,2) 
(-2,2,2) 
(-2,2,3) 
(-1,2,3) 
(0,1,3) 

我的動機:

此代碼的目的是模擬的隨機遊動的3種 尺寸N個步驟。在每個步驟中,選擇一個隨機方向(北,南,東,西,上,下),並在該方向上採用大小爲1的步驟。然後打印新的位置。起始位置是原點(0,0,0)。

我的代碼:

import pdb 
import random # this helps us generate random numbers 
N = 30 # number of steps 
n = random.random() # generate a random number 

x = 0 
y = 0 
z = 0 
count = 0 
while count <= N: 
    if n < 1/6: 
     x = x + 1   # move east 
     n = random.random() # generate a new random number 
    if n >= 1/6 and n < 2/6: 
     y = y + 1   # move north 
     n = random.random() # generate a new random number 
    if n >= 2/6 and n < 3/6: 
     z = z + 1   # move up 
     n = random.random() # generate a new random number 
    if n >= 3/6 and n < 4/6: 
     x = x - 1   # move west 
     n = random.random() # generate a new random number 
    if n >= 4/6 and n < 5/6: 
     y = y - 1   # move south 
     n = random.random() # generate a new random number 
    if n >= 5/6: 
     z = z - 1   # move down 
     n = random.random() # generate a new random number 

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

環境:

的Python 3.5 Jupyter筆記本電腦時,Windows 10,戴爾XPS 13

+0

注在Python中,'n> = 2/6和n <3/6'可以拼寫成'2/6 <= n <3/6' – Eric

回答

2

您在if設置n到一個新的隨機數測試

if n < 1/6: 
    x = x + 1   # move east 
    n = random.random() # generate a new random number 

這意味着下一個if然後測試可以匹配新的n,每步更改一次。

n = random.random()步驟移至循環的頂部,每步僅生成一次。你可能想使用elif以及以避免過多的測試:

N = 30 # number of steps 

x = 0 
y = 0 
z = 0 

for count in range(N): 
    n = random.random() # generate a new random number 
    if n < 1/6: 
     x = x + 1   # move east 
    elif n < 2/6: 
     y = y + 1   # move north 
    elif n < 3/6: 
     z = z + 1   # move up 
    elif n < 4/6: 
     x = x - 1   # move west 
    elif n < 5/6: 
     y = y - 1   # move south 
    else: 
     z = z - 1   # move down 

    print("(%d,%d,%d)" % (x,y,z)) 

我也切換到使用for遍歷range(),這樣你就不必手動增加和測試count

這可以通過使用一個列表存儲方向,random.range()接在該列表中的索引在隨機可進一步簡化,並且random.choice()選擇什麼樣的方向改變,在步驟:

N = 30 # number of steps 

pos = [0, 0, 0] 

for count in range(N): 
    index = random.randrange(3) # generate a new random index 
    change = random.choice([-1, 1]) 
    pos[index] += change 

    print(tuple(pos)) 
+1

'%pos'應該是'%tuple(pos)',否則我會得到一個TypeError,因爲格式化不能解壓列表 – Eric

+0

或者直接打印該元組:-) –