我的代码在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
答案 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
的值。