Python学习笔记:使用Pygal模拟掷骰子

# -*- coding: utf-8 -*-
"""
Created on Sat Mar 14 21:26:55 2020

@author: 86159
"""
# use #%% to create cells;Run current cell(ctrl+enter)
#pygal:生成可缩放的矢量图形文件
#对于需要在不同的屏幕上显示的图表,这很有用,因为它们将自动缩放,以适合观看者的屏幕
#在这个项目中,将对掷骰子的结果进行分析
#在数学领域,常用掷骰子来解释各种数据分析,它在赌场和其他博弈场景中也得到了实际应用,例如游戏大富翁以及众多角色扮演游戏中
#%%
#掷骰子
from die import Die #from 模块名 import 类名

#创建一个D6
die=Die()
x=die.roll()#掷一次骰子

print(x)
#%%
#掷骰子多次--一个
import pygal
#自己编写的模块放在下面,分隔开
from die import Die

die=Die(8)#创建一个8面骰子

results=[]#存储多次掷骰子的结果,类型为列表

for roll_num in range(1000):#循环100次
    x=die.roll()#方法返回值是本次掷骰子的结果
    results.append(x)#在列表的末尾插入新元素

#print(results)#观察结果,值的范围为[1,8]
#for result in results:#遍历列表元素
#    print(str(result)+' ',end='')

#分析结果
freq_dict={}#存储每个值出现的次数,类型为字典,元素为键-值对,键是数值 值是出现次数
freq_list=[]
for value in range(1,die.num_sides+1):
    ct=results.count(value)#统计value在列表results中出现的次数
    freq_dict[value]=ct#在字典中(末尾)插入新元素,字典名[键]=值,键的类型可以为数字、字符串
    freq_list.append(ct)#把出现的频次按value大小存入列表中

print("\n",freq_dict)
for key,value in freq_dict.items():#遍历字典
    print(str(key)+":"+str(value))
    
#绘制直方图
#对结果进行可视化
hist=pygal.Bar()#创建一个pygal.Bar()实例

hist.title="Results of rolling one D8 1000 times"#标示直方图的字符串
hist.x_labels=['1','2','3','4','5','6','7','8']#掷骰子的可能结果用作x轴的标签
hist.x_title="Result"#给x轴添加标题
hist.y_title="Frequency of Result"

hist.add("D8",freq_list)#将一系列值添加到图表中,.add(title,values,**kwargs) values类型应该为列表,title为给添加的值指定的标签
hist.render_to_file("die_visual.svg")#将图表渲染为一个SVG文件,扩展名必须为.svg;在web浏览器中查看生成的直方图
#Pygal让这个图表具有交互性:将鼠标指向该图表中的任何条形,将看到与之相关联的数据
#%%
#掷骰子--两个
import pygal

from die import Die
#创建两个Die实例,代表两个骰子
die_1=Die()
#die_2=Die()
die_2=Die(8)#8面骰子,传递实参8,修改默认值6
#掷骰子的结果
results=[]
for roll_num in range(10000):#设置掷骰子的次数
    result=die_1.roll()+die_2.roll()
    results.append(result)
#分析数据--统计出现频次    
frequences=[]
max_num=die_1.num_sides+die_2.num_sides
for value in range(2,max_num+1):#两个骰子之和的取值范围为[2,max_num],最小值是2
    freq=results.count(value)
    frequences.append(freq)
print(frequences)
 #可视化结果   
hist=pygal.Bar()

#hist.x_labels=['2','3','4','5','6','7','8','9','10','11','12']#两个6面骰子
#hist.x_labels=['2','3','4','5','6','7','8','9','10','11','12','13','14']#一个6面,一个8面
hist.x_labels=[x for x in range(2,max_num+1)]#使用列表解析[变量 循环],x_labels值自动生成;[str(x) for x in range(2,max_num+1)]也可以
#hist.title="Results of rolling two D6 dice 1000 times"
hist.title="Results of rolling a D6 and a D8 10000 times"
hist.x_title="Result"
hist.y_title="Frequency of Result"

hist.add("D6+D8",frequences)
#hist.render_to_file("DD66_visual.svg")
hist.render_to_file("D6D8_visual.svg")

die.py

#创建Die类
from random import randint#随机整数randint(s,e) 返回值取值范围为[起始值,终止值],整数

class Die():
    '''表示一个骰子的类'''
    
    def __init__(self,num_sides=6):#可选参数,骰子默认指6面的,D6;8面的骰子名为D8
        '''骰子默认为6面'''
        self.num_sides=num_sides
        
    def roll(self):
        '''返回一个位于1和骰子面数之间的随机值'''
        return randint(1,self.num_sides)#返回起始值1、终止值num_sides或这两个值之间的任何整数

 

发布了78 篇原创文章 · 获赞 31 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_37209590/article/details/104869466