我正在使用Python 3.下面的代码尝试在3维中模拟random walk的N个步骤。在每个步骤中,选择随机方向(北,南,东,西,上,下),每个方向具有1/6的概率,并且在该方向上采用尺寸为1的步长。然后打印新位置。起始位置是原点(0,0)。
即使没有错误消息,代码也无效。我们应该在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 :(得分:3)
您应该使用elif
而不是那么多ifs。每次评估if时,n的值都会改变,然后可能有资格获得下一个if。
答案 1 :(得分: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))
答案 2 :(得分:1)
无论您使用的是哪个版本的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)
打印实际类型{{1} } - 将产生<type 'int'>
。
因此,当您运行程序时,所有n
s只会满足最后一个条件(全部大于0)。