小象学院—小象学院—Python学习联盟08—模拟掷骰子
案例描述:
- 通过计算机程序模拟掷骰子,并显示各点数出现次数及频率
- 比如,抛掷两个骰子50次,出现点数为7的次数是8,频率0.16
必备知识点:
- 如何通过python模拟随机事件?或者生成随机数?
random模块
- 遍历列表时,如何同时获取每个元素的索引号及其元素值:
具体代码:
版本1.0:模拟抛掷1个骰子,并输出其结果
''' 模拟掷骰子 版本1.0 ''' import random def roll_dice(): ''' 扔骰子的函数 ''' roll = random.randint(1,6) return roll def main(): total_time = int(input('输入抛掷骰子几次:')) #初始化列表【0,0,0,0,0,0】记录出现点数的次数 result_list =[0]*6 for i in range(total_time): roll = roll_dice() for j in range(1,7): if roll == j: result_list[j-1] += 1 print(result_list) if __name__ == '__main__': main()
输出更详细的代码:
''' 模拟掷骰子 版本1.0 ''' import random def roll_dice(): ''' 扔骰子的函数 ''' roll = random.randint(1,6) return roll def main(): total_time = int(input('输入抛掷骰子几次:')) #初始化列表【0,0,0,0,0,0】记录出现点数的次数 result_list =[0]*6 for i in range(total_time): roll = roll_dice() for j in range(1,7): if roll == j: result_list[j-1] += 1 #输出索引号和内容。 for k,m in enumerate(result_list): print('点数:{},次数{},频率:{}'.format(k+1,m,m/total_time)) if __name__ == '__main__': main()
版本2.0:模拟抛掷两个骰子,并输出结果。(输出两个骰子点数和)
- 如何将对应的点数和次数关联起来?
用字典的形式
- zip函数:zip()函数用于将对应的元素打包成一个元组
- 注意:元组中的元素是不可修改的,若要修改需要转换成字典或其他
- dict(zip(l1,l2))
代码:
''' 模拟掷骰子 版本2.0 ''' import random def roll_dice(): ''' 扔骰子的函数 ''' roll = random.randint(1,6) return roll def main(): total_time = int(input('输入抛掷骰子几次:')) #初始化列表 result_list = [0]*11 #次数列表,点数2-12,共11种可能 roll_list = list(range(2,13)) #点数和列表.range不包含后一位,即不包含13 roll_dict = dict(zip(roll_list, result_list)) for i in range(total_time): roll1 = roll_dice() roll2 = roll_dice() for j in range(2,13): #range不包含后一位,即不包含13 if (roll1+roll2) == j: roll_dict[j] += 1 #字典的遍历与输出 for i,result in roll_dict.items(): print('骰子点数:{},次数{},频率:{}'.format(i,result,result/total_time)) if __name__ == '__main__': main()
版本3.0:可视化掷骰子结果
- python数据可视化:matplotlib模块
具体代码:
''' 模拟掷骰子 版本3.0 ''' import random import matplotlib.pyplot as plt def roll_dice(): ''' 扔骰子的函数 ''' roll = random.randint(1,6) return roll def main(): total_time = int(input('输入抛掷骰子几次:')) #初始化列表 result_list = [0]*11 #次数列表,点数2-12,共11种可能 roll_list = list(range(2,13)) #点数和列表.range不包含后一位,即不包含13 roll_dict = dict(zip(roll_list, result_list)) #记录骰子结果 roll1_list = [] roll2_list = [] for i in range(total_time): roll1 = roll_dice() roll2 = roll_dice() roll1_list.append(roll1) roll2_list.append(roll2) for j in range(2,13): #range不包含后一位,即不包含13 if (roll1+roll2) == j: roll_dict[j] += 1 #字典的遍历与输出 for i,result in roll_dict.items(): print('骰子点数:{},次数{},频率:{}'.format(i,result,result/total_time)) #数据可视化 x = range(1,total_time+1) plt.scatter(x, roll1_list, c='red', alpha=0.5) #设置透明度0.5 plt.scatter(x, roll2_list, c='green', alpha=0.5) #c=''设置颜色 plt.show() if __name__ == '__main__': main()
版本4.0:对抛掷结果进行简单的数据统计和分析(采用直方图)
直方图:
matplotlib绘制直方图
plt.hist(data,bins)
data:数据列表
bins:分组边界
具体代码:
''' 模拟掷骰子 版本4.0 ''' import random import matplotlib.pyplot as plt #更改绘图的语言,将负号变成False。(利用中文对图片进行标注,解决中文显示问题) 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_time = int(input('输入抛掷骰子几次:')) #记录骰子结果 roll_list = [] for i in range(total_time): roll1 = roll_dice() roll2 = roll_dice() roll_list.append(roll1+roll2) for j in range(2,13): #range不包含后一位,即不包含13 if (roll1+roll2) == j: roll_dict[j] += 1 #字典的遍历与输出 for i,result in roll_dict.items(): print('骰子点数:{},次数{},频率:{}'.format(i,result,result/total_time)) #直方图 plt.hist( roll_list,range(2,14),normed=1,edgecolor='black',linewidth=1) #edgecolor指定边界的颜色。linewidth指定边界的宽度 #normed归一化。求频率,即频率总和为1 plt.title('骰子点数统计') plt.xlabel('点数') plt.ylabel('频率') plt.show() if __name__ == '__main__': main()
输出结果:
版本5.0:使用科学计算库Numpy简化程序,完善数据可视化结果
np.histogram()输出直方图的统计结果。
具体代码:
''' 模拟掷骰子 版本5.0 ''' import numpy as np import matplotlib.pyplot as plt #更改绘图的语言,将负号变成False。(利用中文对图片进行标注,解决中文显示问题) plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False def main(): total_time = int(input('输入抛掷骰子几次:')) #记录骰子结果 roll1_arr = np.random.randint(1, 7, size=total_time) roll2_arr = np.random.randint(1, 7, size=total_time) result_arr = roll1_arr +roll2_arr hist, bins = np.histogram(result_arr,bins=range(2,14)) print(hist) print(bins) #数据可视化(直方图) plt.hist( result_arr,range(2,14),edgecolor='black',linewidth=1,rwidth=0.8) #edgecolor指定边界的颜色。linewidth指定边界的宽度。rwidth宽度 #normed归一化。求频率,即频率总和为1 #设置x轴坐标点显示 tick_labels = ['2点','3点','4点','5点','6点','7点', '8点','9点','10点','11点','12点'] tick_pos = np.arange(2,13) + 0.5 plt.xticks(tick_pos,tick_labels) plt.title('骰子点数统计') plt.xlabel('点数') plt.ylabel('频率') plt.show() if __name__ == '__main__': main()