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()
補充說明:
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()
補充說明:
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()
補充說明:
1. matplotlib模塊
- matplotlib是一個數據可視化函數庫
- matplotlib的子模塊pyplot提供了2D圖標制作的基本函數
- 例子:https://matplotlib.org/gallery.html
- 散點圖繪制
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()
補充說明:
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()
補充說明:
1. NumPy
- NumPy(Numeric Python):用Python實現的科學計算庫
- 包括:
- 強大的N維數組對象array
- 成熟的科學函數庫
- 實用的線性代數、隨機數生成函數等
- NumPy的操作對象是多維數組ndarray
- ndarray.shape數組的維度
- 創建數組:np.array(<list>),np.arrange()...
- 改變數組形狀reshape()
2. NumPy創建隨機數組
- np.random.randint(a,b,size):創建[a,b)間形狀為size的數組
3. NumPy基本運算
- 以數組為對象進行基本運算,即向量化操作
- np.histogram()輸出直方圖的統計結果