在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))
你怎么认为我可以解决这一问题?
非常感谢。
您应该使用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'>
。
正因为如此,当你运行你的程序时,所有的n
s只会满足最后一个条件(全部会大于0)。
考虑到我们所看到的行为,实际上可能并非如此。他们可能使用Python 3,其中1/6用float division进行评估。如果这是整数除法,则每个循环都会将z减1并且不会改变其他值。 –
@Jeremy McGibbon如果没有帮助,我会将其删除 - 为我的工作如同一个魅力(在Python 2.7上) - 为整个问题进行测试。 – atru
这个改变对我没有帮助,在Python 3.5上测试过。确保你没有得到任何两个数字改变的行(例如'(-7,-2,2)'到'(-7,-1,1)'。 –
你使用Python 2或3吗? –