[英]Python probability algo
我正在嘗試計算將兩個骰子擲成2的概率。 我知道概率公式是
# Probability of an Event = Number of Favorable Outcomes Total / Number of Possible Outcomes
我能夠從算法上提出解決方案,但無法在return語句中明確說明公式。 我將如何使用此解決方案
import random
def roll_dice(n, range):
total_count = 0
for i in xrange(range):
while True:
total_count +=1
d1, d2 = random.randint(1,n), random.randint(1,n)
if d1 == d2:
break
return #probability
print roll_dice(6, 1000)
無論擲骰子多少次,概率都是相同的。 1/36。 1個有利的結果除以36個可能的結果。 擲骰子很多次來計算,最終看起來更像是貝爾曲線 。 如果那是您想要的,則計數得到2 1s並除以范圍。
編輯:添加代碼
def roll_dice(n, range):
total_count = 0
for i in xrange(range):
d1, d2 = random.randint(1,n), random.randint(1,n)
if d1 == 1 and d2 == 1:
total_count+=1
return total_count/range
您無法獲得使用此代碼獲得兩個ones
概率。 您的代碼(錯誤地歸因於while True
,這是錯誤的)所做的是計算從兩個獨立的骰子中獲得任意兩個相等結果所需的嘗試次數。
該概率可以用簡單概率理論確定。 為了獲得任何兩個相等的結果, p = (1/36) * 6 = 1/6
。
這意味着可以預期的是,在兩個獨立骰子的每6次投擲中,有一次您會從每個骰子中獲得相同的結果(例如,兩個fours
或兩個sixes
)。
如果您想通過算法找到它,則可以運行類似於蒙特卡洛的模擬,以查看在隨機世界中發生這種情況的預期次數。
使用您自己的算法(進行一些小的修改):
import random
def roll_dice(n, arange):
total_count = 0
for i in range(arange):
total_count +=1
d1, d2 = random.randint(1,n), random.randint(1,n)
if d1 == d2:
break
return total_count
z=[]
s=1000
for i in range(s):
z.append(roll_dice(6, 1000))
>>> np.array(z).mean()
5.916666666666667
# s=100000
>>> np.array(z).mean()
5.9943
您將看到,正如預期的那樣,模擬的數量越多,期望的均值越接近6。
此外,如果您想找到描述情況的平均值(即找到兩個出現ones
概率),則可以更改此行(占任意兩個相等的數字 )
if d1 == d2:
對於以下內容(僅說明輸出為one
的情況):
if d1 == d2 and (d1==1):
然后,您可以運行並找到
>>> np.array(z).mean()
35.8479
接近預期的36
。
發生這種情況是因為您正在分析X*Y
等於1的概率,並且X*Y
是兩個高斯隨機變量的乘積。 因此, X*Y
的分布不是正態分布,而是將遵循這兩個變量的乘積分布 (請參閱此處 )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.