博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【每天学点Python】案例七:模拟掷骰子
阅读量:5150 次
发布时间:2019-06-13

本文共 6984 字,大约阅读时间需要 23 分钟。

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()
View Code

补充说明:

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()
View Code

补充说明:

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()
View Code

补充说明:

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()
View Code

补充说明:

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()
View Code

补充说明:

1. NumPy

  • NumPy(Numeric Python):用Python实现的科学计算库
  • 包括:
    1. 强大的N维数组对象array
    2. 成熟的科学函数库
    3. 实用的线性代数、随机数生成函数等
  • NumPy的操作对象是多维数组ndarray
    1. ndarray.shape数组的维度
  • 创建数组:np.array(<list>),np.arrange()...
  • 改变数组形状reshape()

2. NumPy创建随机数组

  • np.random.randint(a,b,size):创建[a,b)间形状为size的数组

3. NumPy基本运算

  • 以数组为对象进行基本运算,即向量化操作
  • np.histogram()输出直方图的统计结果

 

转载于:https://www.cnblogs.com/Kevin-WangXinzheng/p/9763193.html

你可能感兴趣的文章
循环引用 。 @class
查看>>
rabbitmq
查看>>
Java网络编程--socket服务器端与客户端讲解
查看>>
Git 中README.md中MarkDown语法示例
查看>>
Android实现双进程守护
查看>>
IPC,Hz(Hertz) and Clock Speed
查看>>
C++ Primer 第二章 学习笔记
查看>>
List_统计输入数值的各种值
查看>>
Cocos2d-x 的“HelloWorld” 深入分析
查看>>
别让青春再浪费_个人经历
查看>>
POJ2566-Bound Found (尺取法)
查看>>
学习笔记-KMP算法
查看>>
学习笔记--树链剖分
查看>>
设计模式《JAVA与模式》之访问者模式
查看>>
Timer-triggered memory-to-memory DMA transfer demonstrator
查看>>
《架构之美》阅读笔记六
查看>>
跨域问题整理
查看>>
[Linux]文件浏览
查看>>
64位主机64位oracle下装32位客户端ODAC(NFPACS版)
查看>>
获取国内随机IP的函数
查看>>