计算机简易模拟掷骰子及概率分析

首先导入必要的模块

import random
import matplotlib.pyplot as plt
from skimage import io
import numpy as np

定义一个生成1-6随机数的函数。

def R():
    my_num = random.randint(1, 6)
    return my_num

1 单个骰子的情况

程序设计

随机生成一个数,并输出对应图像和结果。骰子六个面的图片已经上传,这里可以直接调用已经上传的图片。

value = R()
if value == 1:
    pic = io.imread('https://img-blog.csdnimg.cn/20210430113740820.png')
elif value == 2:
    pic = io.imread('https://img-blog.csdnimg.cn/20210430113803765.png')
elif value == 3:
    pic = io.imread('https://img-blog.csdnimg.cn/20210430113812813.png')
elif value == 4:
    pic = io.imread('https://img-blog.csdnimg.cn/20210430113825334.png')
elif value == 5:
    pic = io.imread('https://img-blog.csdnimg.cn/20210430113837221.png')
elif value == 6:
    pic = io.imread('https://img-blog.csdnimg.cn/20210430113843762.png')
io.imshow(pic)
plt.axis('off')
plt.show()
print('点数为%d' % value)

概率分析

下面通过批量操作来观察单个骰子情况下的概率。

N = 100000  # 掷骰子次数
num_list = [0] * 6  # 初始化记录次数的列表
value_list = [0] * N  # 初始化记录历次结果的列表
for i in range(1, N+1):
    value_list[i-1] = R()
    for j in range(1, 7):
        if value_list[i-1] == j:
            num_list[j-1] += 1
for x, num in enumerate(num_list):  # 遍历列表索引值及各点数出现的次数
    print('点数%s的次数:%d,频率:%.4f' % (x + 1, num, num / N))

画出频率直方图

plt.rcParams['font.sans-serif'] = ['SimHei']  # 解决无法显示中文的问题
plt.rcParams['axes.unicode_minus'] = False
plt.hist(value_list, np.arange(0.5, 7.5), density=1, linewidth=1, rwidth=0.6)
plt.title('单个骰子点数统计')
x_axis = ['1点', '2点', '3点', '4点', '5点', '6点']
plt.xticks(np.arange(1, 7), x_axis)
plt.xlabel('点数')
plt.ylabel('频率')
plt.show()

由数据和图像可见,各点数的概率符合实际情况。

2 两个骰子的情况

同样通过批量操作进行分析。

N = 100000  # 掷骰子次数
double_num_list = [0] * 11  # 初始化记录次数的列表
double_value_list = [0] * N  # 初始化记录历次结果的列表
value1_list = [0] * N  # 初始化记录历次结果的列表
value2_list = [0] * N  # 初始化记录历次结果的列表
for i in range(1, N+1):
    value1_list[i-1] = R()
    value2_list[i-1] = R()
    double_value_list[i-1] = value1_list[i-1]+value2_list[i-1]
    for j in range(2, 13):
        if double_value_list[i-1] == j:
            double_num_list[j-2] += 1
for x, num in enumerate(double_num_list):  # 遍历列表索引值及各点数出现的次数
    print('点数%s的次数:%d,频率:%.4f' % (x + 2, num, num / N))

画出频率直方图。

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.hist(double_value_list, np.arange(1.5, 13.5), density=1, linewidth=1, rwidth=0.6)
plt.title('两个骰子点数统计')
x_axis = ['2点', '3点', '4点', '5点', '6点', '7点', '8点', '9点', '10点', '11点', '12点']
plt.xticks(np.arange(2, 14), x_axis)
plt.xlabel('点数')
plt.ylabel('频率')
plt.show()

由数据和图像可见,各点数的概率也符合实际情况。

3 带有交互效果和频率统计的完整程序

import random
import matplotlib.pyplot as plt
from skimage import io


def R():  # 定义生成随机数的函数
    my_num = random.randint(1, 6)
    return my_num


N = 0
value_list = [0]*100
for i in range(0, 100):
    str = input("开始请输入s(start),退出请输入q(quit):")
    if(str == "s"):
        value = R()
        value_list[i] = value
        N += 1
        if value == 1:
            pic = io.imread(
                'https://img-blog.csdnimg.cn/20210430113740820.png')
        elif value == 2:
            pic = io.imread(
                'https://img-blog.csdnimg.cn/20210430113803765.png')
        elif value == 3:
            pic = io.imread(
                'https://img-blog.csdnimg.cn/20210430113812813.png')
        elif value == 4:
            pic = io.imread(
                'https://img-blog.csdnimg.cn/20210430113825334.png')
        elif value == 5:
            pic = io.imread(
                'https://img-blog.csdnimg.cn/20210430113837221.png')
        elif value == 6:
            pic = io.imread(
                'https://img-blog.csdnimg.cn/20210430113843762.png')
        io.imshow(pic)
        plt.axis('off')
        plt.show()
        print('点数为%d' % value)
    if(str == "q"):
        break
print("你的历次结果为:")
for j in range(0, N):
    print(value_list[j])

num_list = [0] * 6  # 初始化记录次数的列表
for i in range(1, N+1):
    for j in range(1, 7):
        if value_list[i-1] == j:
            num_list[j-1] += 1
for x, num in enumerate(num_list):  # 遍历列表索引值及各点数出现的次数
    print('点数%s的次数:%d,频率:%.4f' % (x + 1, num, num / N))

NJU Probability Theory

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值