用 Pygal 模拟掷骰子

news2024/10/7 10:19:00

这篇博客,我们将学习使用 python可视化包 Pygal 来生成矢量图形文件。针对于需要在尺寸不同的屏幕上显示的图表具有很大用处。因为它们可以自动缩放,以此来适合观看者的屏幕。
.
在这个项目中,我们将对掷骰子的结果进行分析。掷6面的常规骰子,所投掷结果的可能性相同。但如果同时投掷两个骰子,某些点数出现的可能性将比其他点数大。
为了确定哪些点数出现的可能性最大,我们生成一个表示投掷骰子结果的数据集,并根据结果绘制出一个图形。

文章目录

        • 安装 Pygal
        • Pygal 画廊
          • 创建 Die 类
          • 掷骰子
          • 分析结果
          • 绘制直方图
          • importError
          • 同时投掷两个骰子
          • 同时投掷两个面数不同的骰子

安装 Pygal

win + R -> cmd 打开命令行窗口

然后录入命令:

python -m pip install --user pygal==1.7

在这里插入图片描述

OK 安装好了。继续往下进行…

Pygal 画廊

创建 Die 类

该类用于模拟掷一个骰子:
die.py

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)
        

关于 Die 类的 init 方法

接收一个可选参数。创建该类实例时,如果没有指定任何参数,面数默认为6。反之,这个值将用于设置骰子的面数。骰子根据面数命名,例:6面命名为D6,8面命名为D8,以此类推。

关于 Die 类的 roll 方法

该方法使用函数 randint() 返回一个1和面数之间的随机数。这个函数可能返回起始值1、终止值num_sides或这两个值之间的任何整数。

掷骰子

在使用这个类来创建图表前,先来投掷D6筛子,将结果打印出来,并检查结果是否合理:
die_visual.py

from die import Die

#创建一个D6
die = Die()

#将所投掷的几次筛子的结果存储到列表中
results =[]
for roll_num in range(10):
    result = die.roll()
    results.append(result)

print(results)

所投掷骰子10次的结果:
在这里插入图片描述

分析结果

为分析投掷一个D6骰子的结果,我们计算每个点数出现的次数:

die_visual.py:

from die import Die

#创建一个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)
print(frequencies)

分析结果:
在这里插入图片描述
为做这个分析:

由于是使用 pygal进行分析,而不是将结果打印出来,因此可以将模拟掷骰子的次数增加到1000。为了分析结果,创建了空列表 frequencies,用于存储每种点数出现的次数。
.
新的循环遍历可能的点数,所谓可能,也就是1~6 常规骰子的数字,计算每种点数在results中出现了多少次,并将这个值附加到列表frequencies的末尾。

如果结果是6个值,那就是合理的,因为骰子只有6个面,也只可能出现6次结果值。

下面我们在来可视化这些结果:

绘制直方图

#直方图是一种条形图,用其指出各种结果出现的频率。
die_visual.py

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)
#print(frequencies)

#对结果进行可视化
hist = pygal.Bar()

hist.title = "Request 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')

前面的代码还是上一小结的 demo。这里没有更改,只是把 print 语句注释掉了。因为有了直方图可以更直观的看到效果,所以注释了控制台中打印的内容。
.
然后导入了 pygael,并创建一个 pygal.Bar() 的实例。
在接下来的 设置标题,x和y坐标的标题就不说了,.render_to_file方法将绘制的直方图渲染为一个文件,并将其存储在项目文件所在的地方。

使用浏览器打开存储在本地 .svg文件,查看效果:
在这里插入图片描述

如果你在途中遇到这样的问题:

importError

import pygal报错ImportError: cannot import name ‘Iterable‘ from ‘collections‘

你可以通过编辑器报错的地方直接跳到 _compat.py 文件中。

然后找到所在行的 第二十行。

也就是:

from collections import Iterable

给其添加后缀,改为:

from collections.abc import Iterable

在然后保存测试即可。

同时投掷两个骰子

dice_visual.py

from die import Die
import pygal
#创建一个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)
#print(frequencies)

#对结果进行可视化
hist = pygal.Bar()

hist.title = "Request 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')

在这里插入图片描述

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

我们来创建一个 6面 和 一个 10面的骰子,看看同时投掷这两个骰子 50 000次的结果:

from die import Die
import pygal
#创建一个D6
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)
#print(frequencies)

#对结果进行可视化
hist = pygal.Bar()

hist.title = "Request of rolling a D6 and a D10 50 dice 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')

查看程序执行结果:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/507623.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

<Linux> 基础IO(文件操作、文件描述符fd、重定向)

基础IO(文件操作、文件描述符fd、重定向) 文章目录 基础IO(文件操作、文件描述符fd、重定向)一、回顾C和C的文件操作二、C语言文件IO1.什么是当前路径?2.C语言文件接口汇总3.默认打开的三个流 三、系统文件IO1.open2.c…

真题详解(索引长度计算)-软件设计(七十一)

真题详解(哈希冲突)-软件设计(七十)https://blog.csdn.net/ke1ying/article/details/130566800 在面向对象系统中,一个类定义了大体相似的对象,这些对象共享_____。 属性和行为。 (属性就是状态) 数据库主要分为用户…

shapefile.js实现shp数据的上传与展示

概述 shapefile是常见的矢量数据格式,但是由于其文件组成结构很难在webgis上直接展示。本文通过express和compressing实现打包后shapefile文件的上传,并结合shapefile.js实现shapefile数据的转换展示。 实现效果 实现代码 1. 后端实现 router.post(/…

Android 引入hunter-debug监测代码运行时函数耗时和参数及返回值,Java(1)

Android 引入hunter-debug监测代码运行时函数耗时和参数及返回值,Java(1) (1)在工程的根build.gradle文件里面添加cn.quinnchen.hunter:hunter-debug-plugin引用: buildscript {repositories {mavenCentra…

SAP CAP篇三:定义Model

SAP CAP篇一:快速创建一个Service,基于Java的实现 SAP CAP篇二:为Service加上数据库支持 文章目录 理解CAP的ModelDomain-Driven DesignKISSBasic TypesCommon Reuse TypecuidmanagedtemporalCountry, Currency, LanguagecodeList Assocation & Comp…

匹配算法之 匈牙利算法详解

参考: 算法学习笔记(5):匈牙利算法漫谈匈牙利算法匈牙利算法、KM算法匈牙利算法(二分图)通俗易懂小白入门)二分图最大匹配——匈牙利算法多目标跟踪之数据关联(匈牙利匹配算法和KM算法)【小白学…

手把手教你使用gtest写单元测试

开源框架:gtest,它主要用于写单元测试,检查真自己的程序是否符合预期行为。这不是QA(测试工程师)才学的,也是每个优秀后端开发codoer的必备技能。 本期博文内容及使用的demo,参考: …

40、Java 并发编程基础 ①

目录 一、进程(Process)二、线程(Thread)三、线程的串行四、多线程五、多线程原理六、多线程优缺点七、Java 的默认线程八、开启新线程(1) new Thread()(2) 继承 Thread,重写 run 方法(3) run() 和 start() 九、多线程…

AutoCV第八课:3D基础

目录 3D基础前言1. nuScenes数据集2. nuScenes数据格式3. 点云可视化总结 3D基础 前言 手写 AI 推出的全新保姆级从零手写自动驾驶 CV 课程,链接。记录下个人学习笔记,仅供自己参考。 本次课程主要学习点云数据的可视化。 课程大纲可看下面的思维导图。…

【Shiro】SimpleAuthenticationInfo如何验证password

一、前言 通篇的关键就是知道ShiroRealm类重写的doGetAuthenticationInfo这个方法,到底是谁的方法。 从上图我们可以知道,ShiroRealm最终继承到了AuthenticatingRealm这个方法。 二、自定义的ShiroRealm类 ps:该图中①上的注释是没看过底…

Jetpack之livedata原理

1.LiveData是什么? 只有在生命周期处于started和resumed时。livedata才会更新观察者 2.Livedata的各种使用方式 1.更新数据 class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceSta…

c++之函数对象和谓词

目录 函数对象: 谓词: 一元谓词函数举例如下 二元谓词举例如下 函数对象和函数的区别 一元谓词的案例 二元函数对象案例 二元谓词案例 函数对象: 重载函数调用操作符的类,其对象常称为函数对象(function obj…

内网渗透之linux到linux横向移动-ssh

0x01 一般情况下SSH密钥存放在~/.ssh/目录下,也可以文件中搜索已保存的SSH凭证 ~/.ssh/config ~/.ssh/known_hosts ~/.bash_history grep -ir "BEGIN RSA PRIVATE KEY" /* grep -ir "BEGIN DSA PRIVATE KEY" /* grep -ir "BEGIN OPENSSH…

SpringBoot入门学习笔记-快速认识

SpringBoot入门学习笔记-快速认识 快速案例入门案例解析parentstarter引导类内嵌tomcat ) 快速案例 在controller定义一个类 package com.ustc.sp5.controller;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.…

redis 数据类型简介

redis 数据类型 redis的五种数据类型是:1、string(字符串);2、hash(哈希);3、list(列表);4、set(集合);5、sort set &…

QT初体验:手把手带你写一个自己的串口助手

前言 本文记录一下用QT Creator 写一个基本功能齐全的串口助手的过程,整个工程只有几百行代码,跟着做下来对新手来说可以更快了解整个QT项目的开发过程和一些常用控件的使用方法。对新手学习QT能增强信心,话不多说,正文开始 先看…

Mysql日志redo log、bin log、undo log 区别与作用及二阶段提交

一、redo log 重做日志 作用:确保事务的持久性。防止在发生故障的时间点,尚有脏页未写入磁盘,在重启mysql服务的时候,根据redo log进行重做,从而达到事务的持久性这一特性。 内容:物理格式的日志&#x…

46-Dockerfile-USER/WORKDIR指令

USER/WORKDIR指令 前言USER作用格式使用示例 WORKDIR作用格式说明使用示例 前言 本篇来学习下Dockerfile中的USER/WORKDIR指令 USER 作用 指定运行容器时的用户名或 UID,后续的RUN等指令也会使用指定的用户身份 说明: USER 只是帮助我们切换到指定的…

12_Uboot启动流程_4

目录 images全局变量 do_bootz函数 bootz_start函数 do_bootm_states函数 bootm_os_get_boot_func函数 do_bootm_linux函数 images全局变量 不管是bootz还是bootm命令,在启动Linux内核的时候都会用到一个重要的全局变量:images, images在文件cmd/bootm.c中有如下定义: i…

【2023/05/09】Scratch

Hello!大家好,我是霜淮子,2023倒计时第4天。 Share The mighty desert is burning for the love of a blade of grass who shaks her head and laughs and flies away. 译文: 无垠的沙漠热烈追求一叶绿草的爱,她摇摇…