重复if语句

时间:2017-09-22 03:11:03

标签: python

我的代码在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  

4 个答案:

答案 0 :(得分:2)

如果从if语句中删除多个n = random.random(),并在while循环开始时用单个n = random.random()替换,则每个循环只有一个步骤。

答案 1 :(得分:1)

问题在于每个if语句中的这一行:n = random.random()。基本上你应该使用if和else如果是这样的话,如果在一次迭代中,如果已经执行了那么它就不会再次被执行。您也可以在所有if语句的末尾添加此行,而不是重复它.n = random.random()

答案 2 :(得分:1)

if链替换多个if-elif-else语句解决了这个问题。此外,您可以使用for代替while进行迭代。此外 - 您不需要在每个n下重新生成if

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

答案 3 :(得分:1)

这是因为您在每个n中设置了if-block,如果也是阻止,则会满足下一个要求。

从所有if块中取出n = random.random()并将其放在while循环结束之前。

提示:
为了调试这个,我会在每个情况下打印n的值。