随机漫步
随机漫步是这样行走得到的路径:每次行走都完全是随机的,没有明确的方向,结果是由一系列随机决策决定的。你可以这样认为,随机漫步就是蚂蚁在晕头转向的情况下,每次都沿随机的方向前行所经过的路径。
代码
from random import choice class RandomWalk(): """一个生成随机漫步数据的类""" def __init__(self, num_points=5000): # 将随机漫步包含的默认点数设置为5000,这大到足以生成有趣的模式,同时又足够小,可确保能够快速地模拟随机漫步 """初始化随机漫步的属性""" self.num_points = num_points # 所有随机漫步都始于(0, 0) self.x_values = [0] self.y_values = [0] def fill_walk(self): """计算随机漫步包含的所有点""" # 不断漫步,直到列表达到指定的长度 while len(self.x_values) < self.num_points: # 决定前进方向以及沿这个方向前进的距离 x_direction = choice([1, -1]) x_distance = choice([0, 1, 2, 3, 4]) # 通过包含0,我们不仅能够沿两个轴移动,还能够沿y轴移动。 x_step = x_direction * x_distance y_direction = choice([1, -1]) y_distance = choice([0, 1, 2, 3, 4]) y_step = y_direction * y_distance # 拒绝原地踏步 if x_step == 0 and y_step == 0: continue # 计算下一个点的x和y值 next_x = self.x_values[-1] + x_step next_y = self.y_values[-1] + y_step self.x_values.append(next_x) self.y_values.append(next_y) #为获取漫步中下一个点的 x 值,我们将x_step与x_values中的最后一个值相加(见❻),对于 y 值也做相同的处理。获得下一个点的 x 值和 y 值后,我们将它们分别附加到列表x_values和y_values的末尾。
将上面的打包好之后,可以有如下应用:
import matplotlib.pyplot as plt from random_walk import RandomWalk # 创建一个RandomWalk实例,并将其包含的点都绘制出来 rw = RandomWalk() ❶ rw.fill_walk() plt.scatter(rw.x_values, rw.y_values, s=15) ❷ plt.show()
画出来的图包含了5000个点的随机漫步图。
模拟多次随机漫步
要在不多次运行程序的情况下使用前面的代码模拟多次随机漫步,一种办法是将这些代码放在一个while
循环中。
import matplotlib.pyplot as plt from random_walk import RandomWalk # 只要程序处于活动状态,就不断地模拟随机漫步 while True: # 创建一个RandomWalk实例,并将其包含的点都绘制出来 rw = RandomWalk() rw.fill_walk() plt.scatter(rw.x_values, rw.y_values, s=15) plt.show() keep_running = input("Make another walk? (y/n): ") ❶ if keep_running == 'n': break
这些代码模拟一次随机漫步,在matplotlib查看器中显示结果,再在不关闭查看器的情况下暂停。如果你关闭查看器,程序将询问你是否要再模拟一次随机漫步。如果你输入y
,可模拟多次随机漫步:这些随机漫步都在起点附近进行,大多沿特定方向偏离起点,漫步点分布不均匀等。要结束程序,请输入n
。