V1.0 模拟抛掷1个骰子,并输出其结果
案例描述:
- 通过计算机程序模拟抛掷骰子,并显示各点数的出现次数及频率
- 比如,抛掷2个骰子50次,出现点数为7的次数是8,频率是0.16
案例分析:
- 如何通过Python模拟随机事件?或者生成随机数?
- random模块
- 遍历列表时,如何同时获取每个元素的索引号及其元素值?
- enumerate()函数
上机实验:
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 # author: Kevin.Wang 4 # time : 2018/10/9 5 6 7 """ 8 作者:王鑫正 9 版本:1.010 日期:2018/10/911 功能:12 """13 import random14 15 16 def roll_dice():17 """18 模拟掷骰子19 """20 roll = random.randint(1, 6)21 return roll22 23 24 def main():25 """26 主函数27 """28 total_time = 1029 30 # 初始化列表[0,0,0,0,0,0]31 result_list = [0] * 632 33 for i in range(total_time):34 roll = roll_dice()35 36 # 获取点数存储到对应次数位置37 for j in range(1, 7):38 if roll == j:39 result_list[j - 1] += 140 41 for i, result in enumerate(result_list):42 print('点数{}的次数{},频率:{}'.format(i + 1, result, result / total_time))43 44 45 if __name__ == '__main__':46 main()
补充说明:
1. random模块
- random模块用于生成随机数
- 常用函数
- random():生成一个[0,1.0)之间的随机浮点数
- uniform(a,b):生成一个a到b之间的随机浮点数
- randint(a,b):生成一个a到b之间的随机整数
- choice(<list>):从列表中随机返回一个元素
- shuffle(<list>):将列表中元素随机打乱
- sample(<list>, k):从指定列表中随机获取k个元素
- 更多random模块的方法请参考:
2. enumerate()函数
- enumerate()函数用于将可遍历的组合转换为一个索引序列
- 一般用于for循环中,同时列出元素和元素的索引号
V2.0增加功能:模拟抛掷2个骰子,并输出结果
案例分析:
- 如何将对应的点数和次数关联起来?
- zip()函数
上机实验:
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 # author: Kevin.Wang 4 # time : 2018/10/9 5 6 7 """ 8 作者:王鑫正 9 版本:2.010 日期:2018/10/911 功能:2.0增加功能:模拟抛掷2个骰子,并输出结果12 """13 import random14 15 16 def roll_dice():17 """18 模拟掷骰子19 """20 roll = random.randint(1, 6)21 return roll22 23 24 def main():25 """26 主函数27 """28 total_time = 1000029 30 # 初始化列表31 result_list = [0] * 1132 # 初始化点数列表33 roll_list = list(range(2, 13))34 roll_dict = dict(zip(roll_list, result_list))35 36 for i in range(total_time):37 roll1 = roll_dice()38 roll2 = roll_dice()39 40 # 获取点数存储到对应次数位置41 for j in range(2, 13):42 if (roll1 + roll2) == j:43 roll_dict[j] += 144 break45 46 for i, result in roll_dict.items():47 print('点数{}的次数{},频率:{}'.format(i, result, result / total_time))48 49 50 if __name__ == '__main__':51 main()
补充说明:
1. zip()函数
- zip()函数用于将对应的元素打包成一个个元组
- 注意:元组中的元素是不可修改的,若要修改需要转换成字典或其他
- dict(zip(l1,l2))
1 l1 = [1,2,3,4,5]2 l2 = ['a','b','c','d','e']3 zip(l1,l2)4 5 >>>[(1,'a'),(2,'b'),(3,'c'),(4,'d'),(5,'e')]
V3.0增加功能:可视化抛掷2个骰子的结果
案例分析:
- Python数据可视化
- matplotlib模块
上机实验:
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 # author: Kevin.Wang 4 # time : 2018/10/9 5 6 7 """ 8 作者:王鑫正 9 版本:2.010 日期:2018/10/911 功能:3.0增加功能:可视化抛掷2个骰子的结果12 """13 import random14 import matplotlib.pyplot as plt15 16 17 def roll_dice():18 """19 模拟掷骰子20 """21 roll = random.randint(1, 6)22 return roll23 24 25 def main():26 """27 主函数28 """29 total_time = 100030 31 # 初始化列表32 result_list = [0] * 1133 # 初始化点数列表34 roll_list = list(range(2, 13))35 roll_dict = dict(zip(roll_list, result_list))36 37 # 记录骰子1的的结果38 roll1_list = []39 roll2_list = []40 41 for i in range(total_time):42 roll1 = roll_dice()43 roll2 = roll_dice()44 45 roll1_list.append(roll1)46 roll2_list.append(roll2)47 48 # 获取点数存储到对应次数位置49 for j in range(2, 13):50 if (roll1 + roll2) == j:51 roll_dict[j] += 152 break53 54 for i, result in roll_dict.items():55 print('点数{}的次数{},频率:{}'.format(i, result, result / total_time))56 57 # 数据可视化58 x = range(1, total_time + 1)59 plt.scatter(x, roll1_list, c='red', alpha=0.5)60 plt.scatter(x, roll2_list, c='green', alpha=0.5)61 plt.show()62 63 64 if __name__ == '__main__':65 main()
补充说明:
1. matplotlib模块
- matplotlib是一个数据可视化函数库
- matplotlib的子模块pyplot提供了2D图标制作的基本函数
- 例子:
- 散点图绘制
1 import matplotlib.pyplot as plt2 #x,y分别是x坐标和y坐标的列表3 plt.scatter(x,y)4 plt.show()
V4.0增加功能:对结果进行简单的数据统计和分析
上机实验:
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 # author: Kevin.Wang 4 # time : 2018/10/9 5 6 7 """ 8 作者:王鑫正 9 版本:4.010 日期:2018/10/911 功能:4.0增加功能:对结果进行简单的数据统计和分析12 """13 import random14 import matplotlib.pyplot as plt15 16 # 解决中文显示问题17 plt.rcParams['font.sans-serif'] = ['SimHei']18 plt.rcParams['axes.unicode_minus'] = False19 20 21 def roll_dice():22 """23 模拟掷骰子24 """25 roll = random.randint(1, 6)26 return roll27 28 29 def main():30 """31 主函数32 """33 total_time = 10000034 roll_list = []35 36 for i in range(total_time):37 roll1 = roll_dice()38 roll2 = roll_dice()39 40 roll_list.append(roll1 + roll2)41 42 # 数据可视化43 bins = range(2, 14)44 plt.hist(roll_list, bins, normed=1, edgecolor='black', linewidth=1)45 plt.title('骰子点数统计')46 plt.xlabel('点数')47 plt.ylabel('频率')48 plt.show()49 50 51 if __name__ == '__main__':52 main()
补充说明:
1. 直方图
- 直方图是一种对数据分布情况的图形表示
- 首先要对数据进行分组,然后统计每个分组内数据的数量
- 作用:
- 显示各分组频率或数量分布的情况
- 易于显示各组之间频率或数量的差别
2. matplotlib绘制直方图
- plt.hist(data, bins)
- data:数据列表
- bins:分组边界
data = [20,30,33,7,76,99,31,57,33,74,90,2,15,11,0,41,13,7,43,6]bins = [0,10,20,30,40,50,60,70,80,90,100]plt.hist(data,bins)
V5.0增加功能:使用科学计算库简化程序,晚上数据可视化结果
案例分析:
- 使用科学计算库NumPy简化程序
上机实验:
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 # author: Kevin.Wang 4 # time : 2018/10/9 5 6 7 """ 8 作者:王鑫正 9 版本:5.010 日期:2018/10/911 功能:5.0增加功能:使用科学计算库简化程序,晚上数据可视化结果12 """13 import matplotlib.pyplot as plt14 import numpy as np15 16 # 解决中文显示问题17 plt.rcParams['font.sans-serif'] = ['SimHei']18 plt.rcParams['axes.unicode_minus'] = False19 20 21 def main():22 """23 主函数24 """25 total_time = 10000026 27 # 记录骰子的结果28 roll1_arr = np.random.randint(1, 7, size=total_time)29 roll2_arr = np.random.randint(1, 7, size=total_time)30 result_arr = roll1_arr + roll2_arr31 32 hist, bins = np.histogram(result_arr, bins=range(2, 14))33 print(hist)34 print(bins)35 36 # 数据可视化37 plt.hist(result_arr, bins=range(2, 14), density=1, edgecolor='black', linewidth=1, rwidth=0.5)38 39 # 设置x轴坐标点显示40 tick_label = ['2点', '3点', '4点', '5点', '6点', '7点', '8点', '9点', '10点', '11点', '12点']41 tick_pos = np.arange(2, 13) + 0.542 plt.xticks(tick_pos, tick_label)43 44 plt.title('骰子点数统计')45 plt.xlabel('点数')46 plt.ylabel('频率')47 plt.show()48 49 50 if __name__ == '__main__':51 main()
补充说明:
1. NumPy
- NumPy(Numeric Python):用Python实现的科学计算库
- 包括:
- 强大的N维数组对象array
- 成熟的科学函数库
- 实用的线性代数、随机数生成函数等
- NumPy的操作对象是多维数组ndarray
- ndarray.shape数组的维度
- 创建数组:np.array(<list>),np.arrange()...
- 改变数组形状reshape()
2. NumPy创建随机数组
- np.random.randint(a,b,size):创建[a,b)间形状为size的数组
3. NumPy基本运算
- 以数组为对象进行基本运算,即向量化操作
- np.histogram()输出直方图的统计结果