用python-plotly模拟掷骰子类的随机过程

python-plotly模拟掷骰子随机过程

澳门赌场在线发牌
只要他用正确的算法
其实这真的是随机事件

其实投掷骰子这种事件是生活中常见的随机事件,这在数学领域常常用来解释各种数据类型分析,而在赌场这些场合它也常见,我们这次就用python对这些随机事件进行模拟并且通过可视化来反应最后的结果

投掷一个骰子

先单独创建一个文件die.py来存储第一个类,我们用它来产生随机数

from random import randint#引用随机模块
class Die:
    """一个骰子的数的类"""
    
    def __init__(self, num_sides=6):
        """一个骰子是六个面的,所以为6"""
        self.num_sides = num_sides
        
    def roll(self):
        """"随机在16间去一个数返回"""
        return randint(1, self.num_sides)

做好类后,我们再创建另一个文件,名字可以任意起。

from plotly.graph_objs import Bar, Layout
from plotly import offline

from die import Die

#首先要把骰子调动过来
die = Die()

# 用一个列表来存储数据
results = []
for roll_num in range(1000):
#循环产生1000个数==投掷1000
    result = die.roll()
    results.append(result)#把数据放入列表
    
# 分析结果
frequencies = []#空列表来存储点数出现的个数
for value in range(1, die.num_sides+1):
#遍历可能的点数,这里的点数是1-6
    frequency = results.count(value)
    frequencies.append(frequency)
    
# 对结果可视化
x_values = list(range(1, die.num_sides+1))
#这里要注意用list把函数range的结果转化成列表,因为plotly不能直接接受range的结果
data = [Bar(x=x_values, y=frequencies)]

x_axis_config = {
    
    'title': 'Result'}
y_axis_config = {
    
    'title': 'Frequency of Result'}
my_layout = Layout(title='Results of rolling one D6 1000 times',
        xaxis=x_axis_config, yaxis=y_axis_config)
#坐标轴是不固定的在用不同的方式配置,用类layout可以指定一个布局和配置对象
offline.plot({
    
    'data': data, 'layout': my_layout}, filename='jie_guo')
#调用一个offline.plot,这个需要一个数据和字典加文件名,文件名是保存的图像的文件名

运行程序会自动生成一个html文件,并在浏览器里面打开,这个就是我们模拟出来的结果图像
在这里插入图片描述

投掷两个骰子

如果同时投掷两个骰子,并且求他们点数总和又是怎么做呢?
我们只需要修改前面的代码就可以了

from plotly.graph_objs import Bar, Layout
from plotly import offline

from die import Die

# 这次我们创建两个骰子
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)
    
# 数据可视化
x_values = list(range(2, max_result+1))
data = [Bar(x=x_values, y=frequencies)]

x_axis_config = {
    
    'title': 'Result', 'dtick': 1}
y_axis_config = {
    
    'title': 'Frequency of Result'}
my_layout = Layout(title='Results of rolling two D6 dice 1000 times',
        xaxis=x_axis_config, yaxis=y_axis_config)
offline.plot({
    
    'data': data, 'layout': my_layout}, filename='d6_d6.html')

最后模拟出来的结果是这样子的

在这里插入图片描述

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

不如说我们投掷的骰子有一个是6面的。有一个是10面的,把它投掷到一定基数,结果会怎么样?我们还是基于上面的代码来看看

from plotly.graph_objs import Bar, Layout
from plotly import offline

from die import Die

#这里要特别注意下,因为是10个面了,我们输入的函数第二个就是10了
die_1 = Die()
die_2 = Die(10)

results = []
for roll_num in range(50_000):
    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)
    
# 数据可视化
x_values = list(range(2, max_result+1))
data = [Bar(x=x_values, y=frequencies)]

x_axis_config = {
    
    'title': 'Result', 'dtick': 1}
y_axis_config = {
    
    'title': 'Frequency of Result'}
my_layout = Layout(title='Results of rolling a D6 and a D10 50000 times',
        xaxis=x_axis_config, yaxis=y_axis_config)
offline.plot({
    
    'data': data, 'layout': my_layout}, filename='d6_d10.html')

最后模拟出来的结果是这样子的

参考文献
python编程从入门到实践–埃里克.马瑟斯

猜你喜欢

转载自blog.csdn.net/weixin_47567401/article/details/113444649