3 回答

TA貢獻1824條經驗 獲得超6個贊
這是獲取您尋求的概率的代碼:
import math
def combinations_of_n_choose_m(n, m):
? ? return math.factorial(n)/math.factorial(n - m)/math.factorial(m)
def probability_of_correct_trials(trials, correct, prob):
? ? return combinations_of_n_choose_m(trials, correct) * prob**correct * (1-prob)**(trials-correct)
print(probability_of_correct_trials(10, 4, .2))
或者在一行中:
r = math.factorial(10)/math.factorial(10 - 4)/math.factorial(4) * prob**4 * (1-prob)**(10-4)
print(r)
結果:
0.08808038400000005
0.08828

TA貢獻1998條經驗 獲得超6個贊
近似該概率的蒙特卡羅方法是讓 Python 生成大量考試(例如一百萬個),其中每個考試有 n=10 個問題,猜出正確答案的機會為 p=1/5。然后你查看模擬考試結果,找出在模擬考試總數中恰好得到 4 個正確答案的分數。
import numpy.random as rnd
n = 10; p = 1/5
numTrials = 10**6
numTimesFourCorrect = 0
for trial in range(numTrials):
numAnswersCorrect = rnd.binomial(n, p)
if numAnswersCorrect == 4:
numTimesFourCorrect += 1
print(numTimesFourCorrect / numTrials)
一次運行在我的機器上給出了 0.088242(每次都不同),非常接近您的期望。原始代碼的主要問題是,它np.random.binomial(n, p, numTrials)會給你的numTrials結果是 0 到 n 之間的數字;所以類似于np.mean(rnd.binomial(n, p, numTrials) == 4)矢量化的方法來做到這一點。

TA貢獻1784條經驗 獲得超7個贊
我想補充一點,可以通過sympy如下方式獲得精確的解析解:
from sympy import stats, Eq
import fractions
# 10 questions with probability of success given by 1/5
X = stats.Binomial('X', 10, fractions.Fraction(1, 5))
P = stats.Probability(Eq(X, 4)).evaluate_integral()
# 172032/1953125 (exact answer)
approx = 172032/1953125
# 0.088080384
添加回答
舉報