这道题的题目存在一点问题,前 + 中 + 后 + 最后 = 98 分,所以我这里擅自把题目做了修改~
一份满分100分的试卷,共有44道题:
前面15道题每题2分,一道题正确率是25%。
中间 5道题每题2分,一道题正确率是50%。
后面15道题每题2分,一道题正确率是25%。
最后10道题每题3分,一道题正确率是25%。
问达到60分的概率是多少?
下面是我基于这个修改尝试进行的解答……
这道题真的太复杂了,我只能先假定 “甲、乙、丙、丁” 前、中、后、最后四种题目是独立的,
后面得想办法找到所有可能的符合条件(总分超过60分)的组合,
那么它们至少应得的分值:
甲:15 * 0.6 = 9,至少需要答对 9 道题
乙:5 * 0.6 = 3,至少需要答对 3 道题
丙:15 * 0.6 = 9,至少需要答对 9 道题
丁:10 * 0.6 = 6,至少需要答对 6 道题
那么按照二项分布的计算法则:
甲:B(9~15; 15, 1/4)
乙:B(3~5; 5, 1/2)
丙:B(9~15; 15; 1/4)
丁:B(6~10; 10; 1/4)
然后我用 Python 算了一下:
from scipy.stats import binom
# 计算甲的二项分布结果
a = sum(binom.pmf(k, 15, 0.25) for k in range(9, 16))
# 计算乙的二项分布结果
b = sum(binom.pmf(k, 5, 0.5) for k in range(3, 6))
# 计算丙的二项分布结果
c = sum(binom.pmf(k, 15, 0.25) for k in range(9, 16))
# 计算丁的二项分布结果
d = sum(binom.pmf(k, 10, 0.25) for k in range(6, 11))
print(f"达到60分的概率是 -> {a * b * c * d * 100:.6f}%")
答案暂时是:达到60分的概率是 -> 0.000017%
但这个不是最终的答案,应该再加上所有其它可能的组合,
比如甲只答对 1 题,但乙、丙、丁多答对几题,也可以使得总分超过 60,
越想越复杂……
暂时放弃……
直接计算不行,咱就换模拟吧~
用蒙特卡洛模拟法:
import numpy as np
def simulate_exam(n_trials=1000000):
scores = []
for _ in range(n_trials):
score = 0
# 前面15道题
score += np.random.choice([0, 2], size=15, p=[0.75, 0.25]).sum()
# 中间5道题
score += np.random.choice([0, 2], size=5, p=[0.5, 0.5]).sum()
# 后面15道题
score += np.random.choice([0, 2], size=15, p=[0.75, 0.25]).sum()
# 最后10道题
score += np.random.choice([0, 3], size=10, p=[0.75, 0.25]).sum()
scores.append(score)
return np.mean(np.array(scores) >= 60)
print(simulate_exam())
把模拟的数量定在百万级别的时候,出现了 3 次 60 分以上的结果,
跟前面二项分布算出来的差了一个量级……
|