前情提要
上篇提到随机漫步可模拟分子运动等现实情况,本篇介绍如何模拟一种常见的情景:掷骰子。
掷骰子
4.1 概述
在数学领域,掷骰子作为一种常见的数据分析模型而存在。在经济等相关领域,它是一种重要的博弈场景。甚至在童年游戏《大富翁》中,也有它的影子。
要模拟此类场景,我们将使用Plotly生成交互式图表进行数据分析。
4.2 Plotly的安装
类比第一篇中安装Matplotlib的操作,同样打开cmd,输入以下命令:
pip install plotly
此时cmd会自动安装Plotly,显示如下:
看到最后一行,我们知道此时Plotly已经准备就绪。
4.3 创建Die类
为模拟掷骰子这一情况,我们需要创造一个Die类。
from random import randint
class Die:
"""表示一个骰子的类"""
#一个六面的骰子
def __init__(self,num_sides=6):
self.num_sides=num_sides
#模拟滚动呐
def roll(self):
"""返回一个合理的随机值"""
return randint(1,self.num_sides)
在设计这个类的时候,单个骰子唯一需要设置的属性是面数。六个面的骰子可简称D6,八个面的可称作D8。
接下来模拟滚动,骰子最终返回一个合理的值。
我们可以先测试一下以上这段代码是否能真的模拟一个骰子。
#创建一个骰子呐
die=Die()
#再来个列表记录一下结果咯
results=[]
#骰子,启动!
for num_roll in range(1,100):
result=die.roll()
results.append(result)
print(results)
运行后数据是可以正常显示的 。(此处仅截取部分)
4.4 分析数据
列表数据总量太大时,无法直观看出有效信息。这个时候需要对数据进行处理,其中最常见的是自动统计频数。此时我们可以书写一段代码自动打印各个情况的频数方便观察。
#看看咋个事儿
frequencies=[]
for value in range(1,die.num_sides+1):
frequency=results.count(value)
frequencies.append(frequency)
print(frequencies)
此时运行可得到一组较为均衡的数据,证实模拟掷骰子这件事的合理性。
4.5 绘制直方图
有了直观的频数列表,我们又可以考虑绘制一种常见的统计图——频率分布直方图。
#对结果可视化
from plotly.graph_objs import Bar,Layout
from plotly import offline
x_values=list(range(1,die.num_sides+1))
data=[Bar(x=x_values,y=frequencies)]
x_axis_config={'title':'results'}
y_axis_config={'title':'result_fre'}
my_layout=Layout(title='final results',xaxis=x_axis_config,yaxis=y_axis_config)
offline.plot({'data':data,'layout':my_layout},filename='D6.html')
注:Plotly不能直接接受range的生成结果,故要用list进行生成数字列表。
类Bar()表示用于绘制条形图的数据集,需要分别存储x和y的列表。这个类必须放在方括号内,因为数据集可能包含多个元素。
类Layout返回一个指定图标布局和配置的对象,这里设置了图表名称,并传入了x轴和y轴的配置字典。
为生成图表,调用函数offline.plot(),除去传输两个已配置完毕的字典参数之外,还指定了保存的文件名。运行过后打开web浏览器标签页即可看见条形图,或在.py文件目录中可寻找到该图像文件。
运行如下:
图像其余属性可自行增添设置使其变得更美观,此处不再赘述。
到此为止,掷一个骰子一次的结果已经相当直观。
4.6 问题拓展
上述阐释了如何显示掷单个骰子,我们可进行问题拓展。
例如,同时掷两个相同面数的骰子?
例如,同时掷两个不同面数的骰子?
这些问题举一反三即可,留给朋友们自己思考。