1、随机漫步就像在沙漠迷失方向的人,任何一步都是随机的方向不确定的。
下面的事例中展示了如何生成随机点并随机生成后面的点并在坐标轴上显示出来,并且用颜色的深浅来展示漫步的过程。
创建随机漫步类 random_walk.py
1 # random_walk.py 2 from random import choice 3 4 #定义一个随机漫步的类 5 class RandomWalk(): 6 def __init__(self,num_points = 5000): 7 self.num_points = num_points; 8 #每次漫步都从(0,0)点出发 9 self.x_values = [0] 10 self.y_values = [0] 11 12 # 选择方向 13 def fill_walk(self): 14 # 不断漫步,直到达到指定的长度 15 while len(self.x_values) < self.num_points: 16 #决定前进的方向以及前进的距离 17 x_direction = choice([1,-1]) 18 x_distance = choice([0,1,2,3,4]) 19 x_step = x_direction *x_distance 20 21 y_direction = choice([1,-1]) 22 y_distance = choice([0,1,2,3,4]) 23 y_step = y_direction*y_distance 24 25 #拒绝原地踏步 26 if x_step == 0 and y_step == 0: 27 continue 28 29 #计算下一个点的x,y值 30 next_x = self.x_values[-1] + x_step 31 next_y = self.y_values[-1] + y_step 32 33 #将所有的点添加到列表中 34 self.x_values.append(next_x) 35 self.y_values.append(next_y)
随机漫步过程 rw_visual.py
1 import matplotlib.pyplot as plt 2 from random_walk import RandomWalk 3 4 #放在while循环中查看多次漫步 5 while True: 6 #创建漫步实例 7 rw = RandomWalk(50000) 8 #调用 fill_walk()函数获得漫步点 9 rw.fill_walk() 10 11 # 设置绘图窗口的尺寸以适应屏幕,单位:英寸 12 plt.figure(figsize = (10,6)) 13 14 #range()函数生成了一个数字列表,其中包含的数字个数与漫步包含的点数相同并保存下来 15 point_numbers = list(range(rw.num_points)) 16 17 #将参数c设置为point_numbers,用来指定颜色映射,并指定颜色为蓝色。从浅蓝色到深蓝色的渐变(突出先后顺序) 18 #edgecolor = 'none' 表示删除每个点周围的轮廓 19 #s代表漫步点的尺寸 20 plt.scatter(rw.x_values,rw.y_values,c = point_numbers,cmap = plt.cm.Blues,edgecolor = 'none',s = 2) 21 22 # 突出起点和终点 23 plt.scatter(0,0,c = 'green',edgecolors = 'none',s = 100) 24 plt.scatter(rw.x_values[-1],rw.y_values[-1],c = 'red',edgecolor = 'none',s = 100) 25 26 # 隐藏坐标轴 27 plt.axes().get_xaxis().set_visible(False) 28 plt.axes().get_yaxis().set_visible(False) 29 30 plt.show() 31 32 keep_running = input("Make another walk?(y/n)") 33 if keep_running == 'n': 34 break
效果展示如下:
2、在随机试验中我们常常通过掷骰子来计算每个面出现的概率,通过随机试验以及做图的方式我们更能直接的看到实验结果。在这个试验中我们常常用到直方图来表示事件出现的频率
下面的程序介绍一下直方图在掷骰子中的应用(这里我们初始化两个骰子:一个面数为6,一个面数为10.每次结果为两个结果的和)。
创建骰子类die.py:
1 from random import randint 2 3 class Die(): 4 def __init__(self,num_sides = 6): 5 #默认骰子为6面 6 self.num_sides = num_sides 7 8 def roll(self): 9 # 返回1和骰子面数之间的随机值 10 return randint(1,self.num_sides)
获取结果并使数据可视化die_visual.py:
from die import Die import pygal die_1 = Die() die_2 = Die(10) #存储掷骰子返回的结果 results = [] for roll_num in range(50000): result = die_1.roll() + die_2.roll() results.append(result) # 分析结果 frequencies = [] max_result = die_1.num_sides + die_2.num_sides #计算每种结果的频数 for value in range(2,max_result+1): frequency = results.count(value) frequencies.append(frequency) # 对结果进行可视化,创建条形图实例 hist = pygal.Bar() hist.title = "Result of rolling one D6 1000 times" hist.x_labels = ['2','3','4','5','6','7','8','9','10','11','12','13','14','15','16'] hist.x_title = "Result" hist.y_title = "Frequency of result" hist.add('D6 + D10',frequencies) hist.render_to_file('die_visual.svg')
效果展示如下: