在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
您在每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))
'%pos'应该是'%tuple(pos)',否则我会得到一个TypeError,因为格式化不能解压列表 – Eric
或者直接打印该元组:-) –
注在Python中,'n> = 2/6和n Eric