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

时间:2016-09-20 06:50:42

标签: python random

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

输出的标题:

(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))

环境:

Jupyter Notebook,Windows 10,Dell XPS 13中的Python 3.5

1 个答案:

答案 0 :(得分:2)

您在{em>每n次测试中将if设置为新的随机数:

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

这意味着下一个 if测试也可以匹配新的n,每步为您提供多个更改。

n = random.random()步骤移动到循环的 top ,每步只生成一次。您可能也希望使用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))