来源:《Python编程:从入门到实践》

文章目录

  • 1
    • 1.1 安装Pygal
    • 1.2 Pygal画廊
    • 1.3 创建Die类
    • 1.4 掷骰子
    • 1.5 分析结果
    • 1.6 绘制直方图
    • 1.7 同时掷两个骰子
    • 1.8 同时掷两个面数不同的骰子
  • 2 练习

1

  • 这部分,将使用Python可视化包Pygal来生成可缩放的矢量图形文件
  • 在这个项目中,将对掷骰子的结果进行分析。掷6面的常规骰子时,出现1~6点的可能性相同。然后,如果同时掷两个骰子,某些点数出现的可能性将比其他点数大。为确定哪些点数出现的可能性最大,我们将生成一个表示掷骰子结果的数据集,并根据结果绘制出一个图形
  • 在数学领域,常利用掷骰子来解释各种数据分析,但它在赌场和其他博弈场景中也得到了实践应用,在游戏《大富翁》以及众多角色扮演游戏中亦如此

1.1 安装Pygal

  • 使用pip安装Pygal
  • Linux和OS X系统,命令类似于:
pip install --user pygal==1.7
  • Windows系统
python -m pip install --user pygal==1.7

1.2 Pygal画廊

  • 想了解Pygal可创建什么样的图表,请查看图表类型画廊:http://www.pygal.org,Document ->> Chart types
  • 每个实例都包含源代码

1.3 创建Die类

  • 下面的类模拟掷一个骰子

die.py

from random import randintclass Die():"""表示一个骰子的类"""def __init__(self, num_sides=6):"""骰子默认为6面"""self.num_sides = num_sidesdef roll(self):"""返回一个位于1和骰子面数之间的随机值"""return randint(1, self.num_sides)
  • 创建Die实例时,如果没有指定任何实参,面数默认为6
  • 方法roll()使用函数randint()来返回一个1~面数的随机值

1.4 掷骰子

  • 创建图表前,先来掷D6骰子,打印结果看是否合理

die_visual.py

from die import Die# 创建一个D6
die = Die()# 掷几次骰子,并将结果存储在一个列表中
results = []
for roll_num in range(100):result = die.roll()results.append(result)print(results)
  • 掷100次的结果存储到results列表

1.5 分析结果

  • 分析掷D6骰子的结果,计算每个点数出现的次数

die_visual.py

--snip--
# 掷几次骰子,并将结果存储在一个列表中
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)print(frequencies)
  • 输出可以看到,没有任何点数出现的频率比其他点数高很多

1.6 绘制直方图

  • 直方图是一种条形图,指出了各种结果出现的频率

die_visual.py

import pygal
--snip--# 对结果进行可视化
hist = pygal.Bar()hist.title = "Results of rolling one D6 1000 times."
hist.x_labels = ['1', '2', '3', '4', '5', '6']
hist.x_title = "Result"
hist.y_title = "Frequency of Result"hist.add('D6', frequencies)
hist.render_to_file('die_visual.svg')
  • 创建条形图——创建了一个pygal.Bar()实例,并将其存储在hist中
  • 将这个图表渲染为一个SVG文件,扩展名必须为.svg
  • 要查看生成的直方图,最简单的方式是使用Web浏览器
  • 为此,在任何Web浏览器中新建一个标签页,再在其中打开文件die_visual.svg
  • 注意: Pygal让这个图表具有交互性:如果将鼠标指向该图表中的任何条形,将看到与之相关联的数据

1.7 同时掷两个骰子

  • 掷两个骰子时,得到的点数更多,结果分布也不同

dice_visual.py

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)# 分析结果
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 = "Results of rolling two D6 dice 1000 times."
hist.x_labels = ['2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12']
hist.x_title = "Result"
hist.y_title = "Frequency of Result"hist.add('D6 + D6', frequencies)
hist.render_to_file('die_visual.svg')

1.8 同时掷两个面数不同的骰子

  • 掷一个6面和一个10面的,同时掷50000次

different_dice.py

import pygal
from die import Die# 创建一个D6 & 一个D10
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 = "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']
hist.x_title = "Result"
hist.y_title = "Frequency of Result"hist.add('D6 + D10', frequencies)
hist.render_to_file('die_visual.svg')

  • 通过使用Pygal来模拟掷骰子的结果,能够非常自由地探索这种现象

2 练习

  1. 自动生成标签: 请修改die_visual.py和dice_visual.py,将用来设置hist.x_labels值的列表替换为一个自动生成这种列表的循环。如果你熟悉列表解析,可尝试将die_visua.py和dice_visual.py中的其他for循环也替换为列表解析

Solution:

die_visual.py

import pygal
from die import Die# 创建一个D6
die = Die()# 掷几次骰子,并将结果存储在一个列表中
results = [die.roll() for roll_num in range(1000)]# 分析结果
frequencies = [results.count(value) for value in range(1, die.num_sides+1)]# 对结果进行可视化
hist = pygal.Bar()hist.title = "Results of rolling one D6 1000 times."
hist.x_labels = [str(x) for x in range(1, die.num_sides+1)]
hist.x_title = "Result"
hist.y_title = "Frequency of Result"hist.add('D6', frequencies)
hist.render_to_file('die_visual.svg')

dice_visual.py

import pygal
from die import Die# 创建两个D6骰子
die_1 = Die()
die_2 = Die()# 掷几次骰子,并将结果存储在一个列表中
results = [die_1.roll() + die_2.roll() for roll_num in range(1000)]# 分析结果
max_result = die_1.num_sides + die_2.num_sides
frequencies = [results.count(value) for value in range(2, max_result+1)]# 对结果进行可视化
hist = pygal.Bar()hist.title = "Results of rolling two D6 dice 1000 times."
hist.x_labels = [str(x) for x in range(2, max_result+1)]
hist.x_title = "Result"
hist.y_title = "Frequency of Result"hist.add('D6 + D6', frequencies)
hist.render_to_file('die_visual.svg')
  1. 两个D8骰子: 请模拟同时掷两个8面骰子1000次的结果。逐渐增加掷骰子的次数,直到系统不堪重负为止

Solution:

import pygal
from die import Die# 创建两个D8骰子
die_1 = Die(8)
die_2 = Die(8)# 掷几次骰子,并将结果存储在一个列表中
results = [die_1.roll() + die_2.roll() for roll_num in range(50000)]# 分析结果
max_result = die_1.num_sides + die_2.num_sides
frequencies = [results.count(value) for value in range(2, max_result+1)]# 对结果进行可视化
hist = pygal.Bar()hist.title = "Results of rolling two D8 dice 50,000 times."
hist.x_labels = [str(x) for x in range(2, max_result+1)]
hist.x_title = "Result"
hist.y_title = "Frequency of Result"hist.add('D8 + D8', frequencies)
hist.render_to_file('die_visual.svg')

Output:

  1. 同时掷三个骰子: 如果你同时掷三个D6骰子,可能得到的最小点数为3,而最大点数为18.请通过可视化展示同时掷三个D6骰子的结果

Solution:

import pygal
from die import Die# 创建三个D6骰子
die_1 = Die()
die_2 = Die()
die_3 = Die()# 掷几次骰子,并将结果存储在一个列表中
results = [die_1.roll() + die_2.roll() + die_3.roll() for roll_num in range(50000)]# 分析结果
max_result = die_1.num_sides + die_2.num_sides + die_3.num_sides
frequencies = [results.count(value) for value in range(3, max_result+1)]# 对结果进行可视化
hist = pygal.Bar()hist.title = "Results of rolling three D6 dice 50,000 times."
hist.x_labels = [str(x) for x in range(3, max_result+1)]
hist.x_title = "Result"
hist.y_title = "Frequency of Result"hist.add('D6 + D6 + D6', frequencies)
hist.render_to_file('die_visual.svg')

Output:

  1. 将点数相乘: 同时掷两个骰子时,通常将它们的点数相加。请通过可视化展示将两个骰子的点数相乘的结果

Solution:

import pygal
from die import Diedie_1 = Die()
die_2 = Die()results = [die_1.roll() * die_2.roll() for roll_num in range(50000)]# 分析结果
max_result = die_1.num_sides * die_2.num_sides
frequencies = [results.count(value) for value in range(1, max_result+1)]# 对结果进行可视化
hist = pygal.Bar()hist.title = "Results of rolling two D6 dice 50,000 times."
hist.x_labels = [str(x) for x in range(1, max_result+1)]
hist.x_title = "Result"
hist.y_title = "Frequency of Result"hist.add('D6 * D6', frequencies)
hist.render_to_file('die_visual.svg')

Output:

Python:使用Pygal模拟掷骰子练习题相关推荐

  1. pygal模拟掷骰子

    本次练习是通过python的pygal来模拟掷骰子的结果.我先创造了一个骰子类(Die),这个类的骰子都有6个面,点数分别是1~6.然后由这个类创建两个实例die1和die2.模拟的是随机投掷这两个筛 ...

  2. 掷骰子python代码_如何使用python的random模拟掷骰子的数据

    python是一个很有趣的语言,可以在命令行窗口运行.python支持面向对象的编程方法,这篇经验就告诉你,如何使用python的random模块,模拟掷骰子的数据. 工具/原料 windows系统电 ...

  3. Python入门:使用Pygal模拟掷骰子

    来源:<Python编程:从入门到实践> 目录 1.安装Pygal 2.Pygal画廊 3.创建Die类 4.掷骰子 5.分析结果 6.绘制直方图 7.同时掷两个骰子 8.同时掷两个面数不 ...

  4. python编写程序掷骰子游戏规则_Python Tkinter实例――模拟掷骰子

    什么是Tkinter? Tkinter 是 Python 的标准 GUI 库.Python 使用 Tkinter 可以快速的创建 GUI 应用程序. 由于 Tkinter 是内置到 python 的安 ...

  5. python编写掷骰子程序_Python Tkinter实例——模拟掷骰子

    什么是tkinter? tkinter 是 python 的标准 gui 库.python 使用 tkinter 可以快速的创建 gui 应用程序. 由于 tkinter 是内置到 python 的安 ...

  6. Pygal简单使用——模拟掷骰子

    目录 1.创建Die类 2.掷骰子 3.分析结果 4.绘制直方图 在这个项目中,我们将对掷骰子的结果进行分析.掷6面的常规骰子时,可能出现的结果为1~6点,且出现每种结果的可能性相同. 然而,如果同时 ...

  7. 掷骰子python代码_Python 使用matplotlib模块模拟掷骰子

    掷骰子 骰子类 # die.py 骰子类模块 from random import randint class Die(): """骰子类""&quo ...

  8. python投掷骰子实验_Python小程序--模拟掷骰子

    案例描述 · 通过计算机程序模拟抛掷骰子,并显示各点数的出现次数及频率 · 比如,抛掷2个骰子50次,出现点数为7的次数是8,频率是0.16 版本1.0 1.0功能:模拟抛掷1个骰子,并输出其结果 如 ...

  9. 投掷骰子的python代码_Python基础篇——模拟掷骰子小游戏

    写在前面 ↓ 骰子是我们经常能看到的小玩意儿,今天我们来做一个模拟掷骰子过程的文字版小游戏,送给幻想编程岛新接触Python的初学者们~ 注:本教程基于64位windows系统(鼠标右键点击桌面&qu ...

最新文章

  1. Wcf 基础教程 服务寄宿之 Windows 服务寄宿
  2. Archive for required library: ‘WebContent/WEB-INF/lib/xxx.jar cannotn
  3. MySQL 数据库误删除后的数据恢复操作说明
  4. 遍历Map keySet和entrySet
  5. 2021-10-13企业财务数据风险预警之随机森林
  6. day10-包的定义和内部类
  7. CentOS录屏快捷键
  8. mybatis传参总结
  9. 二分查找的代码实现--go语言
  10. java之classloader的对象层次关系
  11. Node.js使用npm下载第三方模块包步骤
  12. python过滤敏感词汇_Python过滤敏感词汇
  13. 独孤求败-小滴云架构大课十八式【xiaoecf】
  14. J - Crashing Robots
  15. 计算机应用基础实训报告excel,excel实验报告模板
  16. Mac电脑下载的google chrome无法使用解决方法?
  17. 关于node版本16+ 安装依赖会出现error的问题
  18. c语言几张图片合成视频,一张有料的图片!!!附文件-图片合成器C语言实现算法-站长资讯中心...
  19. Python+Vue计算机毕业设计童童摄影馆管理系统yyt8p(源码+程序+LW+部署)
  20. 东华大学计算机学院刘国华,东华大学计算机科学与技术学院研究生导师简介-刘国华??(教授)...

热门文章

  1. 数据结构与算法分析——排序算法总结
  2. dqn系列梳理_强化学习:DQN与Double DQN讨论
  3. VS报错信息:无法打开包括文件:“d3dx9math.h“或者“d3dx9.h”或者“D3DX9.LIB“:No such file of directory
  4. 全球最大的OpenStack集群背后:中国移动的开源之旅
  5. [BZOJ1018]SHOI2008堵塞的交通|线段树
  6. 学完计算机英语感想,学英语感悟,学完英语的收获和感想!
  7. elasticsearch中分词器edge_ngram和ngram的区别
  8. Flink/Blink 原理漫谈(一)时间,watermark详解
  9. win10计算机默认用户名和密码是什么,win10共享的文件夹需要密码和用户名登陆...
  10. calc(陈立杰) 解题报告