2017-09-22 94 views
1

我遇到一個問題,我的代碼映射在3D空間中隨機遊走。此代碼的目的是模擬3維隨機遊走的N個步驟。在每個步驟中,選擇一個隨機方向(北,南,東,西,上,下),並在該方向上採用大小爲1的步驟。這是我的代碼:重複如果語句

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)) 

問題是我在每次迭代之間獲得的不止一個步驟。我添加了評論,顯示了迭代之間的差異。

以下是輸出的第10行:

(0,-1,0) #1 step 
(0,-2,0) #1 step 
(1,-3,1) #4 steps 
(1,-4,1) #1 step 
(1,-3,1) #1 step 
(1,-2,1) #1 step 
(2,-2,0) #2 steps 
(2,-2,0) #0 steps 
(2,-2,0) #0 steps 
(2,-1,0) #1 step 

回答

1

的問題在於這條線在每個if語句:N = random.random()。基本上你應該使用if和else如果是這樣的話,如果在一次迭代中,如果已經被執行,那麼它不會再被執行。您也可以在全部if語句的末尾添加此行,而不是重複它。n = random.random()

1

替換多個if語句,鏈條爲if-elif-else解決了此問題。此外,你可以迭代使用for而不是while。另外 - 您不需要在每個if下重新生成n

import random # this helps us generate random numbers 

N = 30 # number of steps 

x = 0 
y = 0 
z = 0 

for _ in range(N): 

    n = random.random() # generate a new random number 

    if n < 1/6: 
     x += 1   # move east 
    elif 1/6 <= n < 2/6: 
     y += 1   # move north 
    elif 2/6 <= n < 3/6: 
     z += 1   # move up 
    elif 3/6 <= n < 4/6: 
     x -= 1   # move west 
    elif 4/6 <= n < 5/6: 
     y -= 1   # move south 
    else: 
     z -= 1   # move down 

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

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

這是因爲你在其中滿足未來如果塊以及每個if-block設置n

只要從if塊中取出n = random.random()並將它放在while循環結束之前。

提示:
要調試這個,我會打印在每個if case的值n

2

如果您從if語句中刪除多個n = random.random(),並在while循環的開始處替換爲單個n = random.random(),則每個循環只會有一個步驟。