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

2024-03-26

我刚刚开始学习 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)。

My code:

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 笔记本、Windows 10、Dell XPS 13 中的 Python 3.5


You set n到一个新的随机数every if test:

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

这意味着next 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.

这可以通过使用进一步简化list存储方向,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))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python 3 中随机游走的奇怪结果? 的相关文章

随机推荐