Python 中的二项式随机变量

我试图仅使用一行代码来解决以下问题:


“假设你参加了一个有 10 个问题的多项选择题测试,每个问题有 5 个答案选择(a、b、c、d、e),那么你仅通过猜测就正确答对 4 个问题的概率是多少?”


我知道答案是 0.08808 或 9% 左右。


我也尝试使用下面的行来反映这个答案


import numpy as np

#number of trials = 10

#number of answers for each question = 5

#probability of answering one correctly = 1/5 or 0.2

# == 1 because 1/0 will indicate correct or incorrect


sum(np.random.binomial(5, 0.2, 10) == 1)/10.


0.2

有人可以阐明如何获得 0.08808 而不是 0.2 吗?


谢谢!


呼如林
浏览 109回答 3
3回答

慕妹3242003

这是获取您寻求的概率的代码:import mathdef 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.088080384000000050.08828

米琪卡哇伊

近似该概率的蒙特卡罗方法是让 Python 生成大量考试(例如一百万个),其中每个考试有 n=10 个问题,猜出正确答案的机会为 p=1/5。然后你查看模拟考试结果,找出在模拟考试总数中恰好得到 4 个正确答案的分数。import numpy.random as rnd n = 10; p = 1/5numTrials = 10**6numTimesFourCorrect = 0for trial in range(numTrials):    numAnswersCorrect = rnd.binomial(n, p)    if numAnswersCorrect == 4:        numTimesFourCorrect += 1print(numTimesFourCorrect / numTrials)一次运行在我的机器上给出了 0.088242(每次都不同),非常接近您的期望。原始代码的主要问题是,它np.random.binomial(n, p, numTrials)会给你的numTrials结果是 0 到 n 之间的数字;所以类似于np.mean(rnd.binomial(n, p, numTrials) == 4)矢量化的方法来做到这一点。

噜噜哒

我想补充一点,可以通过sympy如下方式获得精确的解析解:from sympy import stats, Eqimport fractions# 10 questions with probability of success given by 1/5X = 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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python