【每天學點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()輸出直方圖的統計結果

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM