目录
在这个项目中,我们将对掷骰子的结果进行分析。掷6面的常规骰子时,可能出现的结果为1~6点,且出现每种结果的可能性相同。 然而,如果同时掷两个骰子,某些点数出现的可能性将比其他点数大。为确定哪些点数出现的可能性最大,我们将生成一个表示掷骰子结果的数据集,并根据结果绘制出一个图形。
下边分步骤来实现模拟掷骰子的项目
1、创建Die类
下边的类模拟投掷一个骰子(die.py):
#!/usr/bin/env python
# -*- coding:utf-8 -*-
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)
方法__init__() 接受一个可选参数。创建这个类的实例时,如果没有指定任何实参,面数默认为6;如果指定了实参,这个值将用于设置骰子的面数。骰子是根据面数命名的,6面的骰子名为D6,8面的骰子名为D8,以此类推。
方法roll() 使用函数randint()来返回一个1和面数之间的随机数。这个函数可能返回起始值1、终止值num_sides或这两个值之间的任何整数。
2、掷骰子
掷D6骰子,将结果打印出来,并检查结果是否合理(die_visual.py):
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from die import Die
# 创建一个D6
die = Die()
# 掷几次骰子, 并将结果存储在一个列表中
results = []
for roll_num in range(100):
result = die.roll()
results.append(result)
print(results)
运行结果的一个示例:
[3, 5, 2, 1, 3, 3, 1, 5, 2, 6, 6, 4, 3, 5, 2, 4, 6, 6, 2, 5, 4, 3, 3, 1, 4, 3, 4, 1, 6, 3,
2, 4, 5, 1, 1, 4, 2, 5, 1, 1, 5, 5, 3, 2, 4, 6, 4, 6, 1, 5, 5, 2, 5, 3, 5, 2, 5, 5, 3, 4,
2, 4, 4, 2, 3, 4, 2, 6, 1, 3, 3, 1, 3, 6, 3, 6, 3, 2, 6, 6, 2, 2, 2, 1, 1, 5, 1, 5, 3, 6,
5, 6, 1, 1, 5, 3, 4, 6, 6, 2]
3、分析结果
为分析掷一个D6骰子的结果,我们计算每个点数出现的次数。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from die import Die
# 创建一个D6
die = Die()
# 掷几次骰子, 并将结果存储在一个列表中
results = []
for roll_num in range(100):
result = die.roll()
results.append(result)
# 分析结果
frequencies = []
for value in range(1, die.num_sides+1):
frequency = results.count(value)
frequencies.append(frequency)
print(frequencies)
运行结果(表示1~6分别出现的次数):
4、绘制直方图
有了频率列表后,我们就可以绘制一个表示结果的直方图。直方图 是一种条形图,指出了各种结果出现的频率。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from die import Die
import pygal
# 创建一个D6
die = Die()
# 掷几次骰子, 并将结果存储在一个列表中
results = []
for roll_num in range(1000):
result = die.roll()
results.append(result)
# 分析结果
frequencies = []
for value in range(1, die.num_sides+1):
frequency = results.count(value)
frequencies.append(frequency)
# 对结果进行可视化
hist = pygal.Bar()
# 设置直方图的属性
hist.title = "Results of rolling one D6 1000 times." #设置直方图标题
hist.x_labels = ['1', '2', '3', '4', '5', '6'] # 设置x轴坐标值
hist.x_title = "Result"
hist.y_title = "Frequency of Result" # 设置x,y坐标轴标题
hist.add('D6', frequencies)
hist.render_to_file('die_visual.svg')
代码解析:
- 为创建条形图, 创建了一个pygal.Bar() 实例,并将其存储在hist中
- 设置hist 的属性title(用于标示直方图的字符串),hist.title = "Results of rolling one D6 1000 times."
- 将掷D6骰子的可能结果用作x轴的标签,hist.x_labels = ['1', '2', '3', '4', '5', '6']
- 给每个轴都添加了标题,hist.x_title = "Result",hist.y_title = "Frequency of Result"
- 我们使用add() 将一系列值添加到图表中(向它传递要给添加的值指定的标签, 还有一个列表, 其中包含将出现在图表中的值),hist.add('D6', frequencies)
- 将这个图表渲染为一个SVG文件, 这种文件的扩展名必须为.svg。hist.render_to_file('die_visual.svg')
- 要查看生成的直方图,最简单的方式是使用Web浏览器,打开文件die_visual.svg(它位于die_visual.py所在的文件夹中) 。