在Python中模拟随机游走

问题描述:

我正在使用Python 3.我的代码尝试在3维中模拟random walk的N个步骤。在每个步骤中,选择一个随机方向(北,南,东,西,上,下),每个方向有1/6的概率,并在该方向上采用大小为1的步骤。然后打印新的位置。起始位置是原点(0,0)。在Python中模拟随机游走

即使没有错误消息,代码也不起作用。我们应该移动只有一步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

你使用Python 2或3吗? –

您应该使用elif而不是如此多的ifs。每次评估if时,n的值都会发生变化,然后可能有资格获得下一个if。

你不仅应该使用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)) 

不管的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) - 这将产生<type 'int'>

正因为如此,当你运行你的程序时,所有的ns只会满足最后一个条件(全部会大于0)。

+1

考虑到我们所看到的行为,实际上可能并非如此。他们可能使用Python 3,其中1/6用float division进行评估。如果这是整数除法,则每个循环都会将z减1并且不会改变其他值。 –

+0

@Jeremy McGibbon如果没有帮助,我会将其删除 - 为我的工作如同一个魅力(在Python 2.7上) - 为整个问题进行测试。 – atru

+0

这个改变对我没有帮助,在Python 3.5上测试过。确保你没有得到任何两个数字改变的行(例如'(-7,-2,2)'到'(-7,-1,1)'。 –