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.0 10 日期:2018/10/9 11 功能: 12 """ 13 import random 14 15 16 def roll_dice(): 17 """ 18 模拟掷骰子 19 """ 20 roll = random.randint(1, 6) 21 return roll 22 23 24 def main(): 25 """ 26 主函数 27 """ 28 total_time = 10 29 30 # 初始化列表[0,0,0,0,0,0] 31 result_list = [0] * 6 32 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] += 1 40 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.0 10 日期:2018/10/9 11 功能:2.0增加功能:模拟抛掷2个骰子,并输出结果 12 """ 13 import random 14 15 16 def roll_dice(): 17 """ 18 模拟掷骰子 19 """ 20 roll = random.randint(1, 6) 21 return roll 22 23 24 def main(): 25 """ 26 主函数 27 """ 28 total_time = 10000 29 30 # 初始化列表 31 result_list = [0] * 11 32 # 初始化点数列表 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] += 1 44 break 45 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.0 10 日期:2018/10/9 11 功能:3.0增加功能:可视化抛掷2个骰子的结果 12 """ 13 import random 14 import matplotlib.pyplot as plt 15 16 17 def roll_dice(): 18 """ 19 模拟掷骰子 20 """ 21 roll = random.randint(1, 6) 22 return roll 23 24 25 def main(): 26 """ 27 主函数 28 """ 29 total_time = 1000 30 31 # 初始化列表 32 result_list = [0] * 11 33 # 初始化点数列表 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] += 1 52 break 53 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图标制作的基本函数
- 例子:https://matplotlib.org/gallery.html
- 散点图绘制
1 import matplotlib.pyplot as plt 2 #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.0 10 日期:2018/10/9 11 功能:4.0增加功能:对结果进行简单的数据统计和分析 12 """ 13 import random 14 import matplotlib.pyplot as plt 15 16 # 解决中文显示问题 17 plt.rcParams['font.sans-serif'] = ['SimHei'] 18 plt.rcParams['axes.unicode_minus'] = False 19 20 21 def roll_dice(): 22 """ 23 模拟掷骰子 24 """ 25 roll = random.randint(1, 6) 26 return roll 27 28 29 def main(): 30 """ 31 主函数 32 """ 33 total_time = 100000 34 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.0 10 日期:2018/10/9 11 功能:5.0增加功能:使用科学计算库简化程序,晚上数据可视化结果 12 """ 13 import matplotlib.pyplot as plt 14 import numpy as np 15 16 # 解决中文显示问题 17 plt.rcParams['font.sans-serif'] = ['SimHei'] 18 plt.rcParams['axes.unicode_minus'] = False 19 20 21 def main(): 22 """ 23 主函数 24 """ 25 total_time = 100000 26 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_arr 31 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.5 42 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()输出直方图的统计结果