1. random_walk.py
from random import choice
class RandomWalk():
"""一个生成随机漫步数据的类"""
# 所有的选择都存储在一个列表中,每次做决定都使用choice()来决定使用哪种选择
# 默认点数5000,大到足以生成有趣的模式,同时又足够小,可确保快速的模拟随机漫步
def __init__(self, num_points=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]) # 决定前进的方向,1为向右,-1为向左
x_distance = choice([0, 1, 2, 3, 4]) # 以及沿着这个方向前进的距离,从0-4随机选择
x_step = x_direction * x_distance
y_direction = choice([1, -1]) # 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值,取列表中的最后一个值加上step
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)
2. rw_visual.py
import matplotlib.pyplot as plt
from random_walk import RandomWalk
# 只要程序处于活动状态,就不断模拟随机漫步
while True:
# 创建一个randomwalk的实例,并将包含的点绘制出来
# RandomWalk(50000),用来增加点数
rw = RandomWalk(50000)
rw.fill_walk()
# 修改窗口尺寸和分辨率,dpi分辨率,figsize窗口尺寸,元组对应单位英寸(这段代码不能放到后面,因为放到后面点数都已绘制了,窗口
# 绘制也没有了)
plt.figure(dpi=128, figsize=(10, 6))
# 漫步中的点是有先后顺序的,按先后顺序给点着色,参数设置5000的列表,按先后顺序绘制颜色映射
point_numbers = list(range(rw.num_points))
plt.scatter(rw.x_values, rw.y_values, c=point_numbers, cmap=plt.cm.Blues, edgecolors='none', s=1)
plt.xlabel("x_values", fontsize=14)
plt.ylabel("y_values", fontsize=14)
plt.title("random_walk", fontsize=20)
# 重新绘制起点和终点,突出起点和终点
plt.scatter(0, 0, c='green', edgecolors='none', s=100)
plt.scatter(rw.x_values[-1], rw.y_values[-1], c='red', edgecolors='none', s=100)
# 隐藏坐标轴
plt.axes().get_xaxis().set_visible(False)
plt.axes().get_yaxis().set_visible(False)
plt.show()
keep_running = input("Make another walk?(y/n):")
if keep_running == 'n':
break
3. 结果