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
添加回答
举报