使用pygal统计投掷N次骰子之后点数的分布情况

一、环境信息

python版本:2.7.13

pygal版本:2.4.0

pygal安装:pip install pygal 从python官方完整下载的最新的python版本自带pip

二、具体实现

投掷N次骰子,然后统计每个点数出现的数字。首先需要实现的是随机点数,具体代码如下:

dice.py
# -*- coding: utf-8 -*-
#pip install pygal

from random import randint

class Dice():
    """表示一个骰子的类"""

    def __init__(self, number_sides=6):
        """骰子默认为6面,称之为D6;如果是8面的骰子称之为D8"""
        self.number_sides = number_sides

    def roll(self):
        """返回一个位于1和骰子面数之间的随机值"""
        return randint(1, self.number_sides)

1、投掷一个6面的骰子(D6)10000次,查看每个点数的统计结果:

dice_visual.py
# -*- coding: utf-8 -*-

import pygal

from dice import Dice

#掷一个骰子
#创建一个D6
dice = Dice()

#将结果存储在一个列表中
results = []
for roll_number in range(10000):
    result = dice.roll()
    results.append(result)

#分析结果:计算每个点数出现的次数
frequencies = []
values = []
for value in range(1, dice.number_sides+1):
    frequency = results.count(value)    #lsit.count(ojb)用于统计某个元素列表中出现的次数。obj是列表中的元素
    frequencies.append(frequency)
    values.append(value)

#对结果进行可视化
hist = pygal.Bar()
#设置直方图的标题
hist.title = ‘Results of rolling one D6 1000 times.‘
#设置x轴的值
hist.x_labels = values
#设置x轴的标签
hist.x_title = ‘Result‘
#设置y轴的标题
hist.y_title = ‘Frequency of Result‘
#将x轴标签的值添加到直方图中
hist.add(‘D6‘, frequencies)
#将这个直方图渲染为一个SVG文件。可以直接使用浏览器打开该文件
hist.render_to_file(‘dice_visual.svg‘)

打开生成的svg文件(可以用浏览器直接打开),结果图如下:

2、同时投掷两个6面的骰子(D6)10000次,查看每个点数的统计结果,只需要修改dice_visual.py:

dice_visual.py
# -*- coding: utf-8 -*-

import pygal

from dice import Dice

#同时掷两个6面的骰子10000次
dice1 = Dice()
dice2 = Dice()

#将结果存储在一个列表中
results = []
for roll_number in range(10000):
    result1 = dice1.roll()
    result2 = dice2.roll()
    results.append(result1 + result2)

#分析结果:计算每个点数出现的次数
frequencies = []
values = []
for value in range(2, dice1.number_sides+dice2.number_sides+1):
    frequency = results.count(value)    #lsit.count(ojb)用于统计某个元素列表中出现的次数。obj是列表中的元素
    frequencies.append(frequency)
    values.append(value)

#对结果进行可视化
hist = pygal.Bar()
#设置直方图的标题
hist.title = ‘Results of rolling one D6 1000 times.‘
#设置x轴的值
hist.x_labels = values
#设置x轴的标签
hist.x_title = ‘Result‘
#设置y轴的标题
hist.y_title = ‘Frequency of Result‘
#将x轴标签的值添加到直方图中
hist.add(‘D6 + D6‘, frequencies)
#将这个直方图渲染为一个SVG文件。可以直接使用浏览器打开该文件
hist.render_to_file(‘dice_visual.svg‘)
打开生成的svg文件(可以用浏览器直接打开),结果图如下:

3、同时投掷一个6面的骰子(D6)和一个10面的骰子(D10)10000次,查看每个点数的统计结果,只需要修改dice_visual.py:

dice_visual.py
# -*- coding: utf-8 -*-

import pygal

from dice import Dice

#掷两个个骰子,一个6面,一个10面
dice1 = Dice()
dice2 = Dice(10)

#将结果存储在一个列表中
results = []
for roll_number in range(10000):
    result1 = dice1.roll()
    result2 = dice2.roll()
    results.append(result1 + result2)

#分析结果:计算每个点数出现的次数
frequencies = []
values = []
for value in range(2, dice1.number_sides+dice2.number_sides+1):
    frequency = results.count(value)    #lsit.count(ojb)用于统计某个元素列表中出现的次数。obj是列表中的元素
    frequencies.append(frequency)
    values.append(value)

#对结果进行可视化
hist = pygal.Bar()
#设置直方图的标题
hist.title = ‘Results of rolling one D6 1000 times.‘
#设置x轴的值
hist.x_labels = values
#设置x轴的标签
hist.x_title = ‘Result‘
#设置y轴的标题
hist.y_title = ‘Frequency of Result‘
#将x轴标签的值添加到直方图中
hist.add(‘D6 + D10‘, frequencies)
#将这个直方图渲染为一个SVG文件。可以直接使用浏览器打开该文件
hist.render_to_file(‘dice_visual.svg‘)

打开生成的svg文件(可以用浏览器直接打开),结果图如下:



原文地址:https://www.cnblogs.com/dbtd/p/8257592.html

时间: 2024-11-09 02:45:38

使用pygal统计投掷N次骰子之后点数的分布情况的相关文章

《剑指offer》 面试题43 n个骰子的点数 (java)

引言:写这篇文章的初衷只是想做个笔记,因为这道题代码量有点大,有点抽象,而书上并没有详细的注释.为了加深印象和便于下次复习,做个记录. 原题:把n个骰子扔到地上,所有骰子朝上一面的点数之后为s. 输入n,打印出s所有可能的值出现的概率.(每个骰子6个面,点数从1到6) 解法一:基于递归,时间效率不高 递归的思想一般是分而治之,把n个骰子分为第一个和剩下的n-1个.先计算第一个骰子每个点数出现的次数,再计算剩余n-1个骰子出现的点数之和.求n-1个骰子的点数之的方法和前面讲的一样,即再次把n-1个

n个骰子的点数

题目:把n个骰子扔在地上,所有骰子朝上一面的点数之和为s,输入n,打印出s的所有可能的值出现的概率. 解法一:基于递归求骰子点数,时间效率不高. 现在我们考虑如何统计每一个点数出现的次数.要想求出n个骰子的点数和,可以先把n个骰子分为两堆:第一堆只有一个,另一个有n-1个,单独的那一个有可能出现从1到6的点数.我们需要计算从1到6的每一种点数和剩下的n-1个骰子来计算点数和.接下来把剩下的n-1个骰子还是分成两堆,第一堆只有一个,第二堆有n-2个.我们把上一轮那个单独骰子的点数和这一轮单独筛子的

剑指Offer面试题43(Java版):n个骰子的点数

题目:把n个骰子仍在地上.全部骰子朝上一面的点数之和为s,输入n,打印出s的全部可能的值出现的概率. 解法一:基于递归求骰子的点数,时间效率不够高 如今我们考虑怎样统计每个点数出现的次数. 要向求出n个骰子的点数和.能够先把n个骰子分为两堆:第一堆仅仅有一个.还有一个有n-1个.单独的那一个有可能出现从1到6的点数. 我们须要计算从1到6的每一种点数和剩下的n-1个骰子来计算点数和. 接下来把剩下的n-1个骰子还是分成两堆,第一堆仅仅有一个.第二堆有n-2个. 我们把上一轮哪个单独骰子的点数和这

剑指Offer对答如流系列 - n个骰子的点数

面试题60:n个骰子的点数 题目描述 把n个骰子扔在地上,所有骰子朝上一面的点数之和为s.输入n,打印出s的所有可能的值出现的概率. 问题分析 这个问题需要点高中数学的知识. 对于n个骰子,要计算出每种点数和的概率,我们知道投掷n个骰子的总情况一共有6^n种,因此只需要计算出某点数和的情况一共有几种,即可求出该点数之和的概率. 思路一:递归暴力 我们知道点数之和s的最小值为n,最大值为6*n,因此考虑用一个大小为(6*n-n+1)的数组存放不同点数之和的情况个数,那么,如果点数之和为x,那么把它

《剑指offer》第六十题:n个骰子的点数

// 面试题60:n个骰子的点数 // 题目:把n个骰子扔在地上,所有骰子朝上一面的点数之和为s.输入n,打印出s // 的所有可能的值出现的概率. #include <cstdio> #include <math.h> int g_maxValue = 6; // ====================方法一==================== void Probability(int current, int sum, int* pProbabilities); void

【编程题目】n 个骰子的点数

67.俩个闲玩娱乐(运算).2.n 个骰子的点数.把 n 个骰子扔在地上,所有骰子朝上一面的点数之和为 S.输入 n,打印出 S 的所有可能的值出现的概率. 思路:用递归把每个骰子的可能情况变量,记录各种和S出现的次数 比上 总情况数就是概率 /* 67.俩个闲玩娱乐(运算). 2.n 个骰子的点数. 把 n 个骰子扔在地上,所有骰子朝上一面的点数之和为 S.输入 n, 打印出 S 的所有可能的值出现的概率. */ #include <stdio.h> #include <stdlib.

n个骰子各点数和出现的概率--动态规划

题目:把n个骰子扔在地上,所有骰子朝上一面的点数之和为S.输入n,打印出S的所有可能的值出现的概率. 声明思想非原创!只因动态规划思想的使用很好,记下! 分析:动态规划就是分阶段考虑问题,给出变量,找出相邻阶段间的关系.具体定义给忘了. 1.现在变量有:骰子个数,点数和.当有k个骰子,点数和为n时,出现次数记为f(k,n).那与k-1个骰子阶段之间的关系是怎样的? 2.当我有k-1个骰子时,再增加一个骰子,这个骰子的点数只可能为1.2.3.4.5或6.那k个骰子得到点数和为n的情况有: (k-1

Hadoop之词频统计小实验(基于单节点伪分布)

声明:1)本文由我bitpeach原创撰写,转载时请注明出处,侵权必究. 2)本小实验工作环境为Ubuntu操作系统,hadoop1-2-1,jdk1.8.0. 3)统计词频工作在单节点的伪分布上,至于真正实际集群的配置操作还没有达到,希望能够由本文抛砖引玉. (一)Hadoop的配置修正 网上有很多Hadoop的配置教程,可自行寻找,这一部分主要是根据自身实际情况,结合自身特点,设置Hadoop.因为有时候根据别人的教程,设置总是不成功,因为别人的教程依赖于别人的软件或操作环境特点. 本部分也

编程算法 - n个骰子的点数(递归) 代码(C)

n个骰子的点数(递归) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 把n个骰子仍在地上, 所有骰子朝上一面的点数之和为s. 输入n, 打印出s的所有可能的值出现的概率. 采用递归的方法, 可以假设只有一个骰子, 然后骰子数递增相加. 代码: /* * main.cpp * * Created on: 2014.7.12 * Author: spike */ #include <stdio.h> #include <stdlib.