案例描述
· 通過計算機程序模擬拋擲骰子,并顯示各點數(shù)的出現(xiàn)次數(shù)及頻率
· 比如,拋擲2個骰子50次,出現(xiàn)點數(shù)為7的次數(shù)是8,頻率是0.16
1.0功能:模擬拋擲1個骰子,并輸出其結(jié)果
如何通過Python模擬隨機事件?或者生成隨機數(shù)?
· random模塊
· 遍歷列表時,如何同時獲取每個元素的索引號及其元素值?
· enumerate()函數(shù)
更多random模塊的方法請參考:
https://docs.python.org/3/library/random.html
- '''
- 功能:模擬擲骰子
- 版本:1.0
- '''
- import random
- def roll_dice():
- '''
- 模擬擲骰子
- '''
- roll = random.randint(1,6)
- return roll
- def main():
- total_times = 10
- #初始化列表[0,0,0,0,0,0]
- result_list = [0] * 6
- for i in range(total_times ):
- roll = roll_dice()
- for j in range(1,7):
- if roll == j:
- result_list [j-1] += 1
- for i, result in enumerate(result_list):
- print('點數(shù){}的次數(shù):{},頻率:{}'.format(i + 1, result, result / total_times))
- if __name__ == '__main__':
- main()
功能:模擬拋擲2個骰子,并輸出其結(jié)果
如何將對應的點數(shù)和次數(shù)關聯(lián)起來?
· zip()函數(shù)
- '''
- 功能:模擬擲骰子
- 版本:2.0
- '''
- import random
- def roll_dice():
- '''
- 模擬擲骰子
- '''
- roll = random.randint(1,6)
- return roll
- def main():
- total_times = 100
- #初始化列表[0,0,0,0,0,0]
- result_list = [0] * 11
- #初始化點數(shù)列表
- roll_list = list(range(2,13))
- roll_dict = dict(zip(roll_list ,result_list )) #元組結(jié)構(gòu)
- for i in range(total_times ):
- roll1 = roll_dice()
- roll2 = roll_dice()
- for j in range(2,13):
- if (roll1+roll2) == j:
- roll_dict[j] += 1
- #遍歷列表
- for i, result in roll_dict.items():
- print('點數(shù){}的次數(shù):{},頻率:{}'.format(i, result, result / total_times))
- if __name__ == '__main__':
- main()
功能:可視化拋擲2個骰子的結(jié)果
Python數(shù)據(jù)可視化
· matplotlib模塊
matplotlib是一個數(shù)據(jù)可視化函數(shù)庫
· matplotlib的子模塊pyplot提供了2D圖表制作的基本函數(shù)
· 例子:https://matplotlib.org/gallery.html
- '''
- 功能:模擬擲骰子
- 版本:3.0
- '''
- import random
- import matplotlib.pyplot as plt
- def roll_dice():
- '''
- 模擬擲骰子
- '''
- roll = random.randint(1,6)
- return roll
- def main():
- total_times = 100
- #初始化列表[0,0,0,0,0,0]
- result_list = [0] * 11
- #初始化點數(shù)列表
- roll_list = list(range(2,13))
- roll_dict = dict(zip(roll_list ,result_list )) #元組結(jié)構(gòu)
- # 記錄骰子的結(jié)果
- roll1_list = []
- roll2_list = []
- for i in range(total_times ):
- roll1 = roll_dice()
- roll2 = roll_dice()
- roll1_list.append(roll1)
- roll2_list.append(roll2)
- for j in range(2,13):
- if (roll1+roll2) == j:
- roll_dict[j] += 1
- #遍歷列表
- for i, result in roll_dict.items():
- print('點數(shù){}的次數(shù):{},頻率:{}'.format(i, result, result / total_times))
- #數(shù)據(jù)可視化
- x = range(1,total_times +1)
- plt.scatter (x,roll1_list ,c='red',alpha = 0.5) #alpha:透明度 c:顏色
- plt.scatter (x, roll2_list, c='green',alpha=0.5)
- plt.show()
- if __name__ == '__main__':
- main()
功能:對結(jié)果進行簡單的數(shù)據(jù)統(tǒng)計和分析
簡單的數(shù)據(jù)統(tǒng)計分析
· matplotlib直方圖
- '''
- 功能:模擬擲骰子
- 版本:4.0
- '''
- import random
- import matplotlib.pyplot as plt
- # 解決中文顯示問題
- plt.rcParams['font.sans-serif'] = ['SimHei'] #SimHei黑體
- plt.rcParams['axes.unicode_minus'] = False
- def roll_dice():
- '''
- 模擬擲骰子
- '''
- roll = random.randint(1,6)
- return roll
- def main():
- total_times = 100
- # 記錄骰子的結(jié)果
- roll_list=[]
- for i in range(total_times ):
- roll1 = roll_dice()
- roll2 = roll_dice()
- roll_list.append(roll1 + roll2)
- #數(shù)據(jù)可視化
- plt.hist(roll_list ,bins=range(2,14),normed= 1,edgecolor='black',linewidth=1)
- #edgeclor:邊緣顏色 linewidth:邊緣寬度 normed=1時轉(zhuǎn)化為概率圖
- plt.title('骰子點數(shù)統(tǒng)計') #名稱
- plt.xlabel('點數(shù)')
- plt.ylabel('頻率')
- plt.show()
- if __name__ == '__main__':
- main()
功能:使用科學計算庫簡化程序,完善數(shù)據(jù)可視化結(jié)果
使用科學計算庫NumPy簡化程序
NumPy的操作對象是多維數(shù)組ndarray
· ndarray.shape 數(shù)組的維度
· 創(chuàng)建數(shù)組:np.array(<list>),np.arrange() …
· 改變數(shù)組形狀 reshape()
NumPy創(chuàng)建隨機數(shù)組
· np.random.randint(a, b, size)
創(chuàng)建 [a, b)間形狀為size的數(shù)組
NumPy基本運算
· 以數(shù)組為對象進行基本運算,即向量化操作
· 例如:
np.histogram() 直接輸出直方圖統(tǒng)計結(jié)果
matplotlib繪圖補充
· plt.xticks() 設置x坐標的坐標點位置及標簽
· plt.title()設置繪圖標題
· plt.xlabel(), plt.ylabel() 設置坐標軸的標簽
- '''
- 功能:模擬擲骰子
- 版本:5.0
- '''
- import random
- import matplotlib.pyplot as plt
- import numpy as np
- # 解決中文顯示問題
- plt.rcParams['font.sans-serif'] = ['SimHei'] #SimHei黑體
- plt.rcParams['axes.unicode_minus'] = False
- def roll_dice():
- '''
- 模擬擲骰子
- '''
- roll = random.randint(1,6)
- return roll
- def main():
- total_times = 1000
- # 記錄骰子的結(jié)果
- roll1_arr = np.random.randint(1,7,size=total_times)
- roll2_arr = np.random.randint(1, 7, size=total_times)
- result_arr = roll1_arr + roll2_arr
- # hist,bins = np.histogram(result_arr ,bins=range(2,14))
- # print(hist)
- # print(bins)
- #數(shù)據(jù)可視化
- plt.hist(result_arr ,bins=range(2,14),normed= 1,edgecolor='black',linewidth=1,rwidth= 0.8)
- #edgeclor:邊緣顏色 linewidth:邊緣寬度 normed=1時轉(zhuǎn)化為概率圖 rwidth:柱子寬度
- #設置X軸坐標點
- tick_labels = ['2點', '3點', '4點', '5點',
- '6點', '7點', '8點', '9點', '10點', '11點', '12點']
- tick_pos = np.arange(2, 13) + 0.5
- plt.xticks(tick_pos,tick_labels)
- plt.title('骰子點數(shù)統(tǒng)計') #名稱
- plt.xlabel('點數(shù)')
- plt.ylabel('頻率')
- plt.show()
- if __name__ == '__main__':
- main()
聯(lián)系客服