lec08-模拟掷骰子
一、v3.0新增功能:可视化投掷两个骰子结果(matplotlib)
"""
版本:3.0
v1.0功能:模拟掷骰子
v2.0新增功能:模拟投掷两个骰子(zip()函数)
v3.0新增功能:可视化投掷两个骰子结果(matplotlib)
"""
import random
import matplotlib
import matplotlib.pyplot as plt
def roll_dice():
# 模拟骰子投掷结果
roll = random.randint(1, 6)
return roll
def main():
# 总投掷次数
total_times = 100
# 初始化列表[0,0,0,0,0,0]
result_list = [0]*11
# 初始化点数列表
roll_list = list(range(2, 13))
# zip()将对应列表打包成元组,为了可修改转换成字典
roll_dict = dict(zip(roll_list, result_list))
# 记录骰子的结果
roll1_list = []
roll2_list = []
for i in range(total_times):
roll1 = roll_dice()
roll2 = roll_dice()
#将投掷结果添加至列表
roll1_list.append(roll1)
roll2_list.append(roll2)
for j in range(2, 13):
if (roll1 + roll2) == j:
roll_dict[j] += 1
print(result_list)
# (v2.0)使用enumerate 遍历列表,获取索引与值
# for i, result in enumerate(result_list):
# 使用.items()遍历字典
for i, result in roll_dict.items():
print('点数{}投掷:{}次,频率:{}'.format(i, result, result/total_times))
# 数据可视化
x = range(1, total_times + 1)
# 设置c颜色,alpha透明度
plt.scatter(x, roll1_list, c='red', alpha=0.5)
plt.scatter(x, roll2_list, c='green', alpha=0.5)
plt.show()
if __name__ == '__main__':
main()
1、random 模块用于生成随机数
常用函数:
2、zip()函数:用于将对应的元素打包成一个个元组
注意:元组中的元素是不可修改的,若要修改需要转换成字典或其他。
3、enumerate()函数:获取函数的索引号及其元素值。
4、matplotlib模块(matplotlib函数库)
其子模块pyplot提供了2D图表制作的基本函数
(1)、散点图绘制
import matplotlib.pyplot as plt
# x,y分别是x坐标和y坐标的列表
plt.scatter(x,y)
plt.show()
绘图结果:
二、v4.0新增功能:直方图可视化结果
1、marplotlib绘制直方图
pil.his(date,bins):date:数据列表;bins:分组边界
2、注意,使用为编写命名时使用中文
# 解决中文显示问题
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
4.0代码:
"""
版本:4.0
v1.0功能:模拟掷骰子
v2.0新增功能:模拟投掷两个骰子(zip()函数)
v3.0新增功能:可视化投掷两个骰子结果(matplotlib)
v4.0新增功能:直方图可视化结果
"""
import random
import matplotlib
import matplotlib.pyplot as plt
# 解决中文显示问题
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
def roll_dice():
# 模拟骰子投掷结果
roll = random.randint(1, 6)
return roll
def main():
# 总投掷次数
total_times = 100000
result_list = [0]*11
roll_list = []
# 循环total_times次
for i in range(total_times):
roll1 = roll_dice()
roll2 = roll_dice()
roll_list.append(roll1 + roll2)
# 数据可视化,绘制直方图,设置密度、边界颜色、宽度
plt.hist(roll_list, bins=range(2, 14), density=1, edgecolor='black', linewidth=1)
#设置标题
plt.title("骰子点数统计")
# x坐标名称
plt.xlabel('点数')
# y坐标名称
plt.ylabel('频率')
plt.show()
if __name__ == '__main__':
main()
执行结果:
三、v5.0新增功能:科学计算
1、NumPy(Numeric Python):用Python实现的科学计算库
包括:(1)、强大的N维数组对象array
(2)、成熟的科学函数库
(3)、使用的线性代数、随机数的生成函数等
2、NumPy的才做对象是多维数组ndarray:ndarray.shape数组的维度
3、创建数值:np.array(<list>),np.arrange()...
4、改变数组形状reshape()
5、NumPython创建随机数组:
np.random.randint(a,b,size) 创建 [a,b) 间形状为size的数组
6、NumPy基本运算:以数组为对象进行基本运算,即向量化操作
7、使用np.histogram()输出直方图的统计结果
matplotlib绘图补充
plt.xticks()设置x坐标的坐标点位置及标签
plt.title()设置绘图标题
plt.xlabel(),plt.ylabel()设置坐标轴的标签
"""
版本:5.0
v1.0功能:模拟掷骰子
v2.0新增功能:模拟投掷两个骰子(zip()函数)
v3.0新增功能:可视化投掷两个骰子结果(matplotlib)
v4.0新增功能:直方图可视化结果
v5.0新增功能:科学计算
"""
import numpy as np
import random
import matplotlib
import matplotlib.pyplot as plt
# 解决中文显示问题
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
def main():
# 总投掷次数
total_times = 100000
# 记录骰子结果
roll1_arr = np.random.randint(1, 7, size=total_times)
roll2_arr = np.random.randint(1, 7, size=total_times)
result_arr = roll1_arr + roll2_arr
# 对结果进行文字化输出
hist, bins = np.histogram(result_arr, bins=range(2, 14))
print(hist)
print(bins)
# 数据可视化,绘制直方图
plt.hist(result_arr, bins=range(2, 14), density=1, edgecolor='black', linewidth=1, rwidth=0.5)
tick_labels = ['2点', '3点', '4点', '5点', '6点', '7点',
'8点', '9点', '10点', '11点', '12点', ]
tick_position = np.arange(2, 13) + 0.5
plt.xticks(tick_position, tick_labels)
plt.title("骰子点数统计")
plt.xlabel('点数')
plt.ylabel('频率')
plt.show()
if __name__ == '__main__':
main()
四、本讲小结: