失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 小象学院—小象学院—Python学习联盟08—模拟掷骰子

小象学院—小象学院—Python学习联盟08—模拟掷骰子

时间:2019-11-05 15:30:39

相关推荐

小象学院—小象学院—Python学习联盟08—模拟掷骰子

案例描述:

通过计算机程序模拟掷骰子,并显示各点数出现次数及频率比如,抛掷两个骰子50次,出现点数为7的次数是8,频率0.16

必备知识点:

如何通过python模拟随机事件?或者生成随机数?

random模块

遍历列表时,如何同时获取每个元素的索引号及其元素值:

enumerate()函数

具体代码:

版本1.0:模拟抛掷1个骰子,并输出其结果

'''模拟掷骰子版本1.0'''import randomdef roll_dice():'''扔骰子的函数'''roll = random.randint(1,6)return rolldef main():total_time = int(input('输入抛掷骰子几次:'))#初始化列表【0,0,0,0,0,0】记录出现点数的次数result_list =[0]*6for i in range(total_time):roll = roll_dice()for j in range(1,7):if roll == j:result_list[j-1] += 1print(result_list)if __name__ == '__main__':main()

输出更详细的代码:

'''模拟掷骰子版本1.0'''import randomdef roll_dice():'''扔骰子的函数'''roll = random.randint(1,6)return rolldef main():total_time = int(input('输入抛掷骰子几次:'))#初始化列表【0,0,0,0,0,0】记录出现点数的次数result_list =[0]*6for 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 randomdef roll_dice():'''扔骰子的函数'''roll = random.randint(1,6)return rolldef main():total_time = int(input('输入抛掷骰子几次:'))#初始化列表result_list = [0]*11#次数列表,点数2-12,共11种可能roll_list = list(range(2,13)) #点数和列表.range不包含后一位,即不包含13roll_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不包含后一位,即不包含13if (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 randomimport matplotlib.pyplot as pltdef roll_dice():'''扔骰子的函数'''roll = random.randint(1,6)return rolldef main():total_time = int(input('输入抛掷骰子几次:'))#初始化列表result_list = [0]*11#次数列表,点数2-12,共11种可能roll_list = list(range(2,13)) #点数和列表.range不包含后一位,即不包含13roll_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不包含后一位,即不包含13if (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.5plt.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 randomimport matplotlib.pyplot as plt#更改绘图的语言,将负号变成False。(利用中文对图片进行标注,解决中文显示问题)plt.rcParams['font.sans-serif'] = ['SimHei']plt.rcParams['axes.unicode_minus'] = Falsedef roll_dice():'''扔骰子的函数'''roll = random.randint(1,6)return rolldef 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不包含后一位,即不包含13if (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归一化。求频率,即频率总和为1plt.title('骰子点数统计')plt.xlabel('点数')plt.ylabel('频率')plt.show()if __name__ == '__main__':main()

输出结果:

版本5.0:使用科学计算库Numpy简化程序,完善数据可视化结果

np.histogram()输出直方图的统计结果。

具体代码:

'''模拟掷骰子版本5.0'''import numpy as npimport matplotlib.pyplot as plt#更改绘图的语言,将负号变成False。(利用中文对图片进行标注,解决中文显示问题)plt.rcParams['font.sans-serif'] = ['SimHei']plt.rcParams['axes.unicode_minus'] = Falsedef 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_arrhist, 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.5plt.xticks(tick_pos,tick_labels)plt.title('骰子点数统计')plt.xlabel('点数')plt.ylabel('频率')plt.show()if __name__ == '__main__':main()

如果觉得《小象学院—小象学院—Python学习联盟08—模拟掷骰子》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。