emmm…
今天看到好友轉發的消息p1,講了一個擲骰子的遊戲p2,然後算了一下發現期望是3.1左右,好像要比每次支付的2.99元要多?
感覺這個用編程來解正好[旺柴]正好最近在看python就索性拿來當成一個練手的小項目[吃瓜]
問題:計算期望
思路:不想按照擲骰子的概率去算…所以直接用隨機數生成器進行n次獨立實驗的模擬,然後把頻率當成概率計算期望,當然關鍵還是數據可視化
p3進行n次模擬,這裏取的一千萬次1e8, 本來想取一億次模擬但是python太慢了[捂臉]將每次獲獎類型保存在prize列表裏,存入.csv文件
p4p5p6讀取文件畫餅狀圖,這裏坑了我好幾次,最後還是統計出像樣的數據和圖來了(p7
Wechar_Game.py
import random
import numpy as np
payment = 2.99 # 每次支付
prize=[] # 儲存每次獲獎情況
n=10000000 #n次實驗
lucky_num=np.random.randint(1,7,n) # 第一次擲色子,幸運數字
get_num=np.random.randint(1,7,n) # 第二次擲色子,中獎數字
for i in range(0,n): # 遍歷列表
if lucky_num[i]==1:
prize.append(0) # 0.88元
elif lucky_num[i]==2 and get_num[i]!=6:
prize.append(1) # 1.88元
elif lucky_num[i]==3 and get_num[i]!=5 and get_num[i]!=6:
prize.append(2) # 3.88元
elif lucky_num[i]==4 and(get_num[i]==1 or get_num[i]==2 or get_num[i]==3):
prize.append(3) # 8.88元
elif lucky_num[i]==5 and (get_num[i]==1 or get_num[i]==2):
prize.append(4) # 12.88元
elif lucky_num[i]==6 and get_num[i]==1:
prize.append(5) #28.88元
else:
prize.append(6) # 未中獎
#print("%f %f" %(prize/n,payment))
np.savetxt('prizes.csv', prize) # 存儲到csv
Graph.py
import csv
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
def read_prizes():
# 讀取文件
pr = pd.read_csv("prizes.csv")
prizes=[]
# 設置中文
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
#設置變量
none=0 # 未中獎
six=0 # 0.88
five=0 # 1.88
four=0 # 3.88
three=0 # 8.88
two=0 # 12.88
one=0 # 28.88
for num in pr.iloc[:,0]: # 遍歷第一列所有數據
# 將str 轉化成 float
if float(num) == 0:
six+=1
elif float(num)==1:
five+=1
elif float(num)==2:
four+=1
elif float(num)==3:
three+=1
elif float(num)==4:
two+=1
elif float(num)==5:
one+=1
elif float(num)==6:
none+=1
#圖標
labels = ['謝謝惠顧','0.88安慰獎', '1.88鼓勵獎', '3.88理財獎','8.88驚爆獎','12.88特等獎','28.88感恩大回饋']
# 對應變量
values = [none,six,five,four,three,two,one]
# 角度
explode=[0,0.1,0,0,0,0]
# 圖例顏色
colors = ['gray','y', 'm', 'b','g','r','c']
# 圖標題目
plt.title("搏一搏 單車變摩托(1e8)", fontsize=25)
# 各項屬性
plt.pie(values, labels=labels, colors=colors, startangle=180, shadow=True, autopct='%1.6f%%')
plt.axis('equal')
# 保存圖片
plt.savefig('E:\\Documents\\千萬.png')
# 顯示圖片
plt.show()
if __name__ =="__main__":
read_prizes()
分析一下:千萬次獨立重複實驗後把頻率看成概率,期望計算結果p8,發現和最初3.1左右差別不大,一定比2.99大。所以真的重複那麼多次很可能賺錢[捂臉]但是單次不回本的概率可以達到0.72219269!也就是大約72%!
總結一下遇到的坑:
- 忘記了不中獎這一種情況……
- 忽略了python區間(a,b)取前不取後的特性……
- csv格式保存文件是科學計數法保存成字符轉的類型,想要使用還需要轉化成數字進行計算
- pandas裏, pr = pd.read_csv(’.csv’) ,pr是一個數據的矩陣,如何使用。
方法歸類:
data = pd.read_csv(self.path)
print(data)
print(data.describe())
print(data.head(5)) #前5行
print(data.iloc[0,:]) #第一行所有數據
print(data.iloc[[1,3,4],:]) #第2 4 6行
print(data.iloc[:,:]) #所有航所有列
print(data.loc[:,'cid'])
for index,row in data.iterrows():
print(row['cid'],row['name'],type(row['cid']),type(row['name']))
- 畫圖
直方圖用到的:
https://www.cnblogs.com/Pythonmiss/p/10642589.html
直方圖擬合正態分佈曲線:
https://blog.csdn.net/jiangjiang_jian/article/details/80664709