在Python中模拟随机游走

时间:2017-09-24 18:32:41

标签: python random-walk

我正在使用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))

您认为我如何解决问题?

非常感谢。

3 个答案:

答案 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来自行检查,0print type(1/6)打印实际类型{{1} } - 将产生<type 'int'>

因此,当您运行程序时,所有n s只会满足最后一个条件(全部大于0)。