卡片收集问题

问题

春节产品设计了一个集卡活动,有45张卡片,共有53次抽卡机会,问我集齐卡片的概率是多大?集齐卡片的抽卡次数期望是多少?

解答

  • 一般性的,设卡片有m张,抽取机会有n次,那么n次集齐的概率

    P(n,m)=m!S(n,m)mn=mi=0(1)iCim(mi)nmn

    其中 S(n,m) 是第二类斯特林数(见后文)。将n次选择看做n个小球,m张卡片看做m个不同盒子,则有 m!S(n,m) 种方案使得每个盒子不为空。
    如果将n=53,m=45带入计算,可以算出 P(53,45)=1.43×1012 ,也就是说全世界人都来参加活动也不太可能出现集齐卡片的人

  • 集齐所有m卡片的期望抽卡次数

    Em=mi=1m1i=mHm

    这个问题叫coupon collector problem,令 Ti 表示收集到了 i1 种卡片之后收集到第 i 种消息所需要的次数, Ti 满足 pi=mi+1m 的几何分布,因此
    Em=i=1mE(Ti)=i=1mmmi+1=mi=1m1i

第二类斯特林数

n个不同的小球放入m个相同的盒子里(n>=m),不允许有空盒,方案数记为S(n,m)

S(n,m)=1m!i=0m(1)iCim(mi)n

证明:
将n个不同的小球放入m个不同的盒子里,允许有空盒的总方案数为 mn ,令 Ai 表示集合盒子 i 为空的方案则有

|Ai|=(m1)n

1i<jm|AiAj|=C2m(m2)n

1i1<i2<...ikm|Ai1Ai2...Aik|=Ckm(mk)n

根据容斥原理
|A1A2...Am|=k=1m(1)k11i1<i2<...ikm|Ai1Ai2...Aik|=k=1m(1)k1Ckm(mk)n

没有空盒的方案数为
|A1¯A2¯...An¯|=mn|A1A2...Am|=k=0m(1)kCkm(mk)n

如果盒子相同,则需要除以盒子的排列数 m!

容斥原理

|A1A2...An|=i=1n|Ai|1i<jn|AiAj|+1i<j<kn|AiAjAk|...(1)n1|A1A2...An|

或写做

|A1A2...An|=k=1n(1)k11i1<i2<...ikn|Ai1Ai2...Aik|

代码

  • 计算代码(matlab) 计算不同抽卡次数和集齐卡片概率P
clear;
N=53:400;
M=45;
s=zeros(1,M+1);
p=zeros(1,length(N))
for j=N
    for i=0:M
        s(i+1)=((-1)^i) * nchoosek(M,i) * ((1-i/M)^j);
    end
    p(j-N(1)+1)=sum(s);
end
E=M*sum(1./(1:M));
plot(N,p);
xlabel('N')
ylabel('P')
title('M=45')

  • 验证代码(matlab)
    仿真100000人参加活动,得到收集卡片数量的分布
clear;
T=100000;                        %仿真人数
M=45;                           %卡片数目
N=53;                           %抽卡次数
randData=randi([1,M],T,N);      %仿真原始数据
collectionNum=zeros(T,1);       %每个人收集的数量
for i=1:T
    collectionNum(i)=numel(unique(randData(i,:)));
end
result=tabulate(collectionNum);
histogram(collectionNum)

你可能感兴趣的:(卡片收集问题)