首先导入必要的模块
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