1. 引言
前面那篇博客《春节与孩子抽王八 -- 优雅的Python》中我用Python模拟了10万次抽王八,验证了实际中观察出来的结果:手里剩牌的张数经常是6~8。
今天用理论推导一下。
2. 思考
这个问题我们很难列出全集(样本空间),因为所有可能的情况(样本点)太多了!
那么我们先把问题往简单方向想想:
1. 小王是我们固定的王八(又名老鳖),它要么归我要么归我女儿,各有1/2概率得到它。暂时把它排出去。
2. 除去小王,还有52张牌要分,一共13个点数,情况很多,怎么办呢?先考虑考虑Ace(A)吧。
A有四张,那么在全集中各得到0、1、2、3、4张的概率是多少?
上面这不就是超几何分布问题吗?以下定义来自百度。
现在我们的问题变成了:有52张牌(N=52) ,包含4个次品A(M=4),从中抽取26张(n=26), 抽到k张A的概率是多少???
借助这个例子说说超几何分布公式的意义,分母是从52张牌中抽26张牌有多少种样本,分子是抽中k个次品的样本总数:分为两部分,从4个次品中抽k个有多少种情况,及从剩下的部分抽26-k非次品, 这样便凑足了26个,两者相乘即抽中k个次品的样本总数。
我们也不需要亲自去算,交给Python即可:
from scipy.stats import hypergeom
N = 52
M = 4
n = 26
# Probabilities of drawing A
for k in range(5):
prob = hypergeom.pmf(k, N, M, n)
print(f"P(X={k}) = {prob:.4f}")
[mzhai /tmp]$ python test.py
P(X=0) = 0.0599
P(X=1) = 0.2597
P(X=2) = 0.3896
P(X=3) = 0.2397
P(X=4) = 0.0511
我们只关心一张A或三张A的情况(出对后手里会剩一张A),P(X=1|3) = 0.2597 + 0.2397 = 0.4994 = 49.94%,也就是全集中有尽一半的case会剩一张A。同样2、3、直到K也都有大概一半的可能性剩一张。所以13个点数最有可能剩13/2=6.5张牌。
最后小王有一半的概率分给我,所有最有可能我手里有6.5+0.5=7张牌(当然实际我分26张牌的话最后肯定是偶数张牌,不可能剩7张。)
如果你非要计算每种情况的概率,可以用二项分布:
1. 对每个4张点数,你分到奇数张的概率为49.94%
2. 总共有13个4张点数,分到奇数张的数量X服从二项分布B(13,0.4994)。
from scipy.stats import binom
n = 13
p = 0.4994
for k in range(14):
prob = binom.pmf(k, n, p)
print(f"P(X={k}) = {prob:.4f}")
P(X=0) = 0.0001
P(X=1) = 0.0016
P(X=2) = 0.0096
P(X=3) = 0.0352
P(X=4) = 0.0878
P(X=5) = 0.1577
P(X=6) = 0.2097
P(X=7) = 0.2092
P(X=8) = 0.1565
P(X=9) = 0.0868
P(X=10) = 0.0346
P(X=11) = 0.0094
P(X=12) = 0.0016P(X=13) = 0.0001
3. 进阶 - 抽x张牌
我们还可以进阶一下:看看抽6张牌。
模拟结果:
0 cards remained: 301 occurrences
2 cards remained: 12243 occurrences
4 cards remained: 51334 occurrences
6 cards remained: 36122 occurrences
理论值:
P(X=0) = 0.6028
P(X=1) = 0.3364
P(X=2) = 0.0573
P(X=3) = 0.0034
P(X=4) = 0.0001
P(X=1|3)*13+0.5=(0.3364+0.0034)*13+0.5 = 4.9
Have fun!