【每天学点Python】案例七:模拟掷骰子

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

补充说明:

1. matplotlib模块

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()
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.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()
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值