我正在運行一些代碼來計算第一次嘗試、第二次嘗試等事件發生的概率。
我相信,我面臨的問題與代碼本身無關,而與random庫有關。
import random
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
denom = 227
trials = 30000
options = [x 1 for x in range(denom)]
itn_list = []
for x in range(trials):
itn = 0
while True:
itn = 1
num = random.choice(options)
if num == 1:
itn_list.append(itn)
break
data = []
for x in range(max(itn_list)):
occurances = itn_list.count(x)
data.append([x, occurances])
data = pd.DataFrame(np.array(data), columns=['Attempts', 'Occurances'])
plt.title('Occurances')
plt.plot(data.Attempts, data.Occurances)
plt.xlim(-1, max(data.Attempts) 1)
plt.ylim(-1, max(data.Occurances) 1)
plt.show()
我最初預計它在第一次嘗試中成功的出現次數非常低,大約 227 次嘗試(因為它是 1/227),然后逐漸向右減少。相反,該圖表在 1-20 次嘗試范圍內最高,這意味著與第 227 次嘗試相比,第一次嘗試成功概率為 1/227 的事件更有可能成功。這是random圖書館的問題,還是我沒有正確理解數學?
隨意嘗試代碼,我不確定如何將影像附加到堆疊溢位中。對不起,如果我沒有很好地解釋它。
uj5u.com熱心網友回復:
看起來你有一個幾何分布。每次嘗試獲得分母 1 的機會都是相等的,但您正在計算第一次成功的嘗試次數。
相反,該圖表在 1-20 次嘗試范圍內最高,這意味著與第 227 次嘗試相比,第一次嘗試成功概率為 1/227 的事件更有可能成功。
這是可以預料的。這樣想:在嘗試i中擊中你的第一個的概率是 1/227,因為在該嘗試中獲得一個,時間為 (226/227) i -1,因為在之前的任何嘗試中都沒有擊中。因此,盡管第一個數字對于任何i都是相同的,但后一個冪會使概率下降i越大。
您可能會注意到,即使i的值很小,數字也沒有那么大。所以從直覺上看,每一個特定的數字都不太可能。這導致您仍然可能在第一個之前等待很長時間,大部分時間。
如果您必須下注任何一個數字,那么在第一次嘗試中下注確實是最佳選擇,因為這是概率分布的最大值。但是這個賭注的幾率會非常不利于你。它仍然只是 227 分之一的機會。
我最初預計它在第一次嘗試中成功的出現次數非常低,大約 227 次嘗試(因為它是 1/227),然后逐漸向右減少。
您可能應該更多地從期望值的角度考慮這一點。雖然概率分布沒有這種尖峰,但預期值為 227,如果每次嘗試的概率相反。
稍微繞道:(226/227) 157≈ 1/2,所以在前 157 次嘗試中沒有得到一個的機會非常接近 50:50。該中位數或 50% 分位數可以為您提供另一個跡象,表明預計會等待很長時間。現在你可能想知道為什么 157 比 227 小這么多。直觀地說,這是因為中位數忽略了距離。它只關心你是否在前 157 次嘗試中得到一個。它不關心你遲早會得到它。因為理論上你可以等待任意長的時間(盡管概率會降低),所以一些迭代的嘗試次數非常多。預期值考慮了實際數字,因此遠高于中位數。盡管每個數字的概率較小,但真正高的數字比真正的低數字更能平衡。
uj5u.com熱心網友回復:
對于任何想要做我在這里所做的事情,但從中獲得有用資訊的人,我制作了一個版本,顯示某些試驗數字發生的事件百分比。請注意,運行更多的代碼trials需要更長的時間,我相信線性地,但會提供更準確的資料。這是代碼:
import random
denom = 227
trials = 25000
options = [x 1 for x in range(denom)]
itn_list = []
for x in range(trials):
itn = 0
while True:
itn = 1
num = random.choice(options)
if num == 1:
itn_list.append(itn)
break
data = []
total_occurences = 0
percentile = 0
for x in range(max(itn_list)):
occurences = itn_list.count(x)
data.append([x, occurences])
total_occurences = occurences
if total_occurences/trials > percentile and occurences > 0:
percentile = 0.005
print("Percentile {:.2%}".format(total_occurences/trials), f"at {x}")
data = pd.DataFrame(np.array(data), columns=['Attempts', 'Occurances'])
plt.title('Occurances')
plt.plot(data.Attempts, data.Occurances)
plt.xlim(-1, max(data.Attempts) 1)
plt.ylim(-1, max(data.Occurances) 1)
plt.show()
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/518225.html
標籤:Python数学统计数据
