模仿醉汉在二维空间上的随机漫步:一个醉汉喝醉酒,每次只能走一步,每步分别沿着x,y轴走一个单位长度,试着画出醉汉的轨迹。
运行环境:
- Python 3.8
- PyCharm Community Edition 2020.3.3 x64
方法一:沿坐标轴移动(四个方向选择或八个方向选择)
import numpy as np
import matplotlib.pyplot as plt
# 定义初始位置坐标 a、b
a = 0
b = 0
# 定义列表 x、y, 为走过的位置记录
x = [a]
y = [b]
# 下一步可以选择的方向
# 四个方向
option = np.array([[0, 1], [1, 0], [0, -1], [-1, 0]])
# 八个方向
# option = np.array([[0, 1], [1, 0], [0, -1], [-1, 0], [1, 1], [1, -1], [-1, -1], [-1, 1]])
# 设置步数
steps = 1000
# 随机漫步
for i in range(steps):
# 随机选择下一步的方向
next = np.random.randint(len(option))
# 更新当前位置
a += np.array(option[next])[0]
b += np.array(option[next])[1]
# 保存到位置记录列表
x.append(a)
y.append(b)
# 画图
# 设置初始点为红色
plt.scatter(0, 0, c='r')
plt.plot(x, y, c='b')
plt.show()
运行结果:
四个方向移动结果 | 八个方向移动结果 |
---|---|
方法二:沿任意方向移动一单位长度
import numpy as np
import matplotlib.pyplot as plt
import math
# 定义初始位置坐标 a、b
a = np.random.randint(10)
b = np.random.randint(10)
# 定义列表 x、y, 为走过的位置记录
x = [a]
y = [b]
# 设置步数
steps = 1000
# 随机漫步
for i in range(steps):
# 随机选择下一步的方向 0 ~ 360 任意方向
next_steps = np.random.randint(360)
# 角度转化为对应的弧度制,便于计算一单位长度 x、y 坐标的变化
angle = np.deg2rad(next_steps)
# 更新当前位置
a += math.cos(angle)
b += math.sin(angle)
# 保存到位置记录列表
x.append(a)
y.append(b)
# 实时画图
# plt.clf() # 清除之前画的图
# plt.scatter(x[0], y[0], c='r')
# plt.plot(x, y, c='b')
# plt.pause(0.1) # 暂停多少秒
# plt.ioff()
# 画图,设置初始点为红色
plt.scatter(x[0], y[0], c='r')
plt.plot(x, y, c='b')
plt.show()
运行结果:
从结果可以看出不管是四个方向移动,还是八个方向移动,还是任意方向移动的,整体的效果都是无序的,因为在每一步选择方向的时候,都是随机选择的,使得下一步是不确定的,所以整体上看都是无序的。