在python 3中随机游走的奇怪结果?

问题描述:

我刚开始学习python,并有一个问题,打印一个新的位置随机游走三维。弹出没有错误,但显然输出(x,y,z)被打印是不合理的!在逐步模拟随机游走时,我假设每次只改变(x,y,z)中的一个值。但它似乎不在输出中。我试图调试它,但仍然困惑于确定真正的问题是什么。在python 3中随机游走的奇怪结果?

输出的头行:

(0,-1,1) 
(-1,0,1) 
(-2,0,1) 
(-2,1,2) 
(-2,2,2) 
(-2,2,3) 
(-1,2,3) 
(0,1,3) 

我的动机:

此代码的目的是模拟的随机游动的3种 尺寸N个步骤。在每个步骤中,选择一个随机方向(北,南,东,西,上,下),并在该方向上采用大小为1的步骤。然后打印新的位置。起始位置是原点(0,0,0)。

我的代码:

import pdb 
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)) 

环境:

的Python 3.5 Jupyter笔记本电脑时,Windows 10,戴尔XPS 13

+0

注在Python中,'n> = 2/6和n Eric

您在if设置n到一个新的随机数测试

if n < 1/6: 
    x = x + 1   # move east 
    n = random.random() # generate a new random number 

这意味着下一个if然后测试可以匹配新的n,每步更改一次。

n = random.random()步骤移至循环的顶部,每步仅生成一次。你可能想使用elif以及以避免过多的测试:

N = 30 # number of steps 

x = 0 
y = 0 
z = 0 

for count in range(N): 
    n = random.random() # generate a new random number 
    if n < 1/6: 
     x = x + 1   # move east 
    elif n < 2/6: 
     y = y + 1   # move north 
    elif n < 3/6: 
     z = z + 1   # move up 
    elif n < 4/6: 
     x = x - 1   # move west 
    elif n < 5/6: 
     y = y - 1   # move south 
    else: 
     z = z - 1   # move down 

    print("(%d,%d,%d)" % (x,y,z)) 

我也切换到使用for遍历range(),这样你就不必手动增加和测试count

这可以通过使用一个列表存储方向,random.range()接在该列表中的索引在随机可进一步简化,并且random.choice()选择什么样的方向改变,在步骤:

N = 30 # number of steps 

pos = [0, 0, 0] 

for count in range(N): 
    index = random.randrange(3) # generate a new random index 
    change = random.choice([-1, 1]) 
    pos[index] += change 

    print(tuple(pos)) 
+1

'%pos'应该是'%tuple(pos)',否则我会得到一个TypeError,因为格式化不能解压列表 – Eric

+0

或者直接打印该元组:-) –