1、使用Pygal模拟掷骰子
1.1 安装Pygal
python -m pip install --user pygal
1.2 创建Die类
from random import randint
class Die():
'''表示一个骰子的类'''
def __init__(self,num_sides=6):
'''骰子默认为6面'''
self.num_sides=num_sides
def roll(self):
'''返回一个位于1和骰子面数之间的随机值'''
return randint(1,self.num_sides)
1.3 掷骰子
from die import Die
#创建一个D6
die=Die()
#掷几次骰子,并将结果存储在一个列表中
results=[]
for roll_num in range(10):
result=die.roll()
results.append(result)
print(results)
输出:
[5, 4, 1, 6, 4, 6, 3, 5, 3, 5]
1.4 分析结果
from die import Die
#创建一个D6
die=Die()
#掷几次骰子,并将结果存储在一个列表中
results=[]
for roll_num in range(20):
result=die.roll()
results.append(result)
print(results)
#分析结果
frequencies=[]
for value in range(1,die.num_sides+1):
frequency=results.count(value)
frequencies.append(frequency)
print(frequencies)
输出:
[1, 2, 4, 2, 1, 1, 6, 2, 3, 3, 3, 4, 3, 5, 1, 3, 6, 2, 2, 6]
[4, 5, 5, 2, 1, 3]
1.5 绘制直方图
直方图是一种条形图,指出了各种结果出现的频率。
import pygal
from die import Die
#创建一个D6
die=Die()
#掷几次骰子,并将结果存储在一个列表中
results=[]
for roll_num in range(1000):
result=die.roll()
results.append(result)
print(results)
#分析结果
frequencies=[]
for value in range(1,die.num_sides+1):
frequency=results.count(value)
frequencies.append(frequency)
print(frequencies)
#对结果进行可视化
hist=pygal.Bar() #创建实例
hist.title="Results of rolling one D6 1000 times." #用于标示直方图的字符串
hist.x_lables=['1','2','3','4','5','6'] #将掷骰子的结果用作x轴的标签
hist.x_title="Result" #给x轴添加标题
hist.y_title="Frequency of Result"
hist.add('D6',frequencies) #用add()函数将一系列的值添加到图表中
hist.render_to_file('die_visual.svg') #将图表渲染为一个SVG文件
输出:
查看生成的直方图,最简单的方式是使用Web浏览器。
pygal让这个图表具有交互性:如果将鼠标指向该图表中的任何条形,将看到与之相关联的数据。
1.6 同时掷两个骰子
import pygal
from die import Die
#创建两个D6骰子
die_1=Die()
die_2=Die()
#掷骰子多次骰子,并将结果存储在一个列表中
results=[]
for roll_num in range(1000):
result=die_1.roll()+die_2.roll() #计算总点数
results.append(result)
print(results)
#分析结果
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)
print(frequencies)
#对结果进行可视化
hist=pygal.Bar() #创建实例
hist.title="Results of rolling one D6 1000 times." #用于标示直方图的字符串
hist.x_labels=['2','3','4','5','6','7','8','9','10','11','12'] #将掷骰子的结果用作x轴的标签
hist.x_title="Result" #给x轴添加标题
hist.y_title="Frequency of Result"
hist.add('D6+D6',frequencies) #用add()函数将一系列的值添加到图表中
hist.render_to_file('dice_visual.svg') #将图表渲染为一个SVG文件
输出:
图表显示总点数为7的可能性最大,总点数为2或12的可能性最小
1.7 同时掷两个面数不同的骰子
import pygal
from die import Die
#创建一个D6和一个D10的骰子
die_1=Die()
die_2=Die(10) #实参为10,表示有10面
#掷骰子多次骰子,并将结果存储在一个列表中
results=[]
for roll_num in range(50000):
result=die_1.roll()+die_2.roll() #计算总点数
results.append(result)
print(results)
#分析结果
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)
print(frequencies)
#对结果进行可视化
hist=pygal.Bar() #创建实例
hist.title="Results of rolling a D6 and a D10 50,000 times." #用于标示直方图的字符串
hist.x_labels=['2','3','4','5','6','7','8','9','10','11','12','13','14','15','16'] #将掷骰子的结果用作x轴的标签
hist.x_title="Result" #给x轴添加标题
hist.y_title="Frequency of Result"
hist.add('D6+D10',frequencies) #用add()函数将一系列的值添加到图表中
hist.render_to_file('different_visual.svg') #将图表渲染为一个SVG文件
输出:
图表显示:可能性最大的点数有5种,即7,8,9,10,11.
总结:使用matplotlib创建简单的图表;使用散点图来探索随机漫步过程;使用Pygal创建直方图;生成数据集及对其进行可视化。