随机游走';python 3中的奇怪结果是什么?

随机游走';python 3中的奇怪结果是什么?,python,random,Python,Random,我刚开始学习python,但在打印三维随机行走的新位置时遇到了一个问题。没有出现错误,但是很明显,正在打印的输出(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) 我的动机: 这段代码的目的是模拟一个随机游动的N步 尺寸。在每个

我刚开始学习python,但在打印三维随机行走的新位置时遇到了一个问题。没有出现错误,但是很明显,正在打印的输出(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)
我的动机:

这段代码的目的是模拟一个随机游动的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))
导入pdb
导入随机数#这有助于我们生成随机数
N=30#步数
n=random.random()#生成一个随机数
x=0
y=0
z=0
计数=0
当计数=1/6且n<2/6时:
y=y+1#向北移动
n=random.random()#生成一个新的随机数
如果n>=2/6且n<3/6:
z=z+1#向上移动
n=random.random()#生成一个新的随机数
如果n>=3/6且n<4/6:
x=x-1#向西移动
n=random.random()#生成一个新的随机数
如果n>=4/6且n<5/6:
y=y-1#向南移动
n=random.random()#生成一个新的随机数
如果n>=5/6:
z=z-1#向下移动
n=random.random()#生成一个新的随机数
打印((%d,%d,%d)“%(x,y,z))
计数=计数+1
打印(“平方距离=%d”%(x*x+y*y+z*z))
环境:


在Jupyter笔记本电脑、Windows 10、Dell XPS 13中的Python 3.5中,您可以在每个
测试中将
n
设置为一个新的随机数,如果
测试:

我还切换到使用
for
循环
范围()
,这样就不必手动增加和测试
计数

这可以通过使用列表存储方向来进一步简化,
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))

请注意,
n>=2/6和n<3/6
可以拼写
2/6
%pos
应该是
%tuple(pos)
,否则我会得到一个类型错误,因为格式化不会解压缩列表或直接打印元组:-)
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)) 
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))