**贈券收集問題**(Coupon collector's problem) 是機率論中的著名題目，其目的在解答以下問題：

假設有*n*種贈券，每種贈券獲取機率相同，而且贈券亦無限供應。若取贈券*t*張，能集齊*n*種贈券的機率多少？
計算得出，平均需要\Theta (n\ln(n))次才能集齊*n*種贈券——这就是赠券收集问题的时间复杂度。例如*n* = 50時大約要取 50\ln(50)+50\gamma +1/2\approx 195.6011+28.8608+0.5\approx 224.9619次才能集齊50種贈券。

問題內容
----

贈券收集問題的特徵是開始收集時，可以在短時間內收集多種不同的贈券，但最後數種則要花很長時間才能集齊。例如有50種贈券，在集齊49種以後要約多50次收集才能找到最後一張，所以贈券收集問題的答案*t*的期望值要比50要大得多。

解答
--

### 計算期望值

假設*T*是收集所有*n*種贈券的次数，t\_{i}是在收集了第*i-1*種贈券以後，到收集到第*i*種贈券所花的次数，那麼*T*和t\_{i}都是隨機變量。在收集到*i-1*種贈券後能再找到「新」一種贈券的概率是p\_{i}={\frac {n-i+1}{n}}，所以t\_{i}是一種幾何分佈，並有期望值{\frac {1}{p\_{i}}}。根據期望值的線性性質，

{\begin{aligned}\operatorname {E}(T)&=\operatorname {E}(t\_{1})+\operatorname {E}(t\_{2})+\cdots +\operatorname {E}(t\_{n})={\frac {1}{p\_{1}}}+{\frac {1}{p\_{2}}}+\cdots +{\frac {1}{p\_{n}}}\\&={\frac {n}{n}}+{\frac {n}{n-1}}+\cdots +{\frac {n}{1}}=n\cdot \left({\frac {1}{1}}+{\frac {1}{2}}+\cdots +{\frac {1}{n}}\right)\,=\,n\cdot H\_{n}.\end{aligned}}
其中H\_{n}是調和數，根據其近似值，可化約為：

\operatorname {E}(T)=n\cdot H\_{n}=n\ln n+\gamma n+{\frac 1{2}}+o(1),\ \ {\text{as}}\ n\to \infty ,
其中\gamma \approx 0.5772156649是歐拉-馬歇羅尼常數. 

那麼，可用馬爾可夫不等式求取機率的上限：

\operatorname {P}(T\geq c\,nH\_{n})\leq {\frac 1c}.
### 變異數

基於t\_{i}相互獨立的特性，則有：

{\begin{aligned}\operatorname {Var}(T)&=\operatorname {Var}(t\_{1})+\operatorname {Var}(t\_{2})+\cdots +\operatorname {Var}(t\_{n})\\&={\frac {1-p\_{1}}{p\_{1}^{2}}}+{\frac {1-p\_{2}}{p\_{2}^{2}}}+\cdots +{\frac {1-p\_{n}}{p\_{n}^{2}}}\\&\leq {\frac {n^{2}}{n^{2}}}+{\frac {n^{2}}{(n-1)^{2}}}+\cdots +{\frac {n^{2}}{1^{2}}}\\&\leq n^{2}\cdot \left({\frac {1}{1^{2}}}+{\frac {1}{2^{2}}}+\cdots \right)={\frac {\pi ^{2}}{6}}n^{2}\leq 2n^{2},\end{aligned}}
最末一行的等式來自黎曼ζ函數的巴塞爾問題。此式繼而可用切比雪夫不等式求取機率上限：

\operatorname {P}\left(|T-nH\_{n}|\geq c\,n\right)\leq {\frac {2}{c^{2}}}.
### 尾部估算

我們亦可用以下方法求另一個的上限：假設{Z}\_{i}^{r}表示在首*r*次收集中未有見到第*i*種贈券，則

{\begin{aligned}P\left[{Z}\_{i}^{r}\right]=\left(1-{\frac {1}{n}}\right)^{r}\leq e^{{-r/n}}\end{aligned}}
所以，若r=\beta n\log n，則有P\left[{Z}\_{i}^{r}\right]\leq e^{{(-\beta n\log n)/n}}=n^{{-\beta }}. 

{\begin{aligned}P\left[T>\beta n\log n\right]\leq P\left[\bigcup \_{i}{Z}\_{i}^{{\beta n\log n}}\right]\leq n\cdot P[{Z}\_{1}]\leq n^{{-\beta +1}}\end{aligned}}
### 用生成函數的解法

另一種解決贈券收集問題的方法是用生成函數。

觀察得出，贈券收集的過程必然如下：

* 收集第一張贈券，其出現的機率是n/n=1
* 收集了若干張第一種贈券
* 收集到一張第二種贈券，其出現的機率是(n-1)/n
* 收集了若干張第一種或第二種贈券
* 收集到一張第三種贈券，其出現的機率是(n-2)/n
* 收集了若干張第一種、第二種或第三種贈券
* 收集到一張第四種贈券，其出現的機率是(n-3)/n
* \ldots
* 收集到一張最後一種贈券，其出現的機率是1/n

若某一刻已若干種贈券，再收集到一張已重覆的贈券的機率是*p*，那麼，再收集到*m*張已重覆的贈券的機率就是p^{m}。則就此部分而言，有關*m*的概率母函数（PGF）是

G(z)=\sum \_{{m=0}}^{\infty }p^{m}z^{m}=1+pz+p^{2}z^{2}+p^{3}z^{3}+\cdots ={\frac {1}{1-pz}}
若將上述收集過程分割為多個階段，則整個收集過程所花的時間的概率母函数為各部分的乘積，亦即

G(z)={\frac {n}{n}}z\cdot {\frac {1}{1-{\frac {1}{n}}z}}\cdot {\frac {n-1}{n}}z\cdot {\frac {1}{1-{\frac {2}{n}}z}}\cdot {\frac {n-2}{n}}z\cdot {\frac {1}{1-{\frac {3}{n}}z}}\cdot {\frac {n-3}{n}}z\cdots {\frac {1}{1-{\frac {n-1}{n}}z}}\cdot {\frac {n-(n-1)}{n}}z.
那麼，根據機率生成函數的特性，總收集次數*T*的期望值是

\operatorname {E}(T)=\left.{\frac {{\mathrm {d}}}{{\mathrm {d}}z}}G(z)\right|\_{{z=1}}
而某一*T*的機率則是

\Pr(T=k)=\left.{\frac {1}{k!}}{\frac {{\mathrm {d}}^{k}G(z)}{{\mathrm {d}}z^{k}}}\right|\_{{z=0}}
計算E(*T*)可先化簡G(z)為

G(z)=z^{n}{\frac {n-1}{n-z}}{\frac {n-2}{n-2z}}{\frac {n-3}{n-3z}}\cdots {\frac {n-(n-1)}{n-(n-1)z}}
因為

{\frac {{\mathrm {d}}}{{\mathrm {d}}z}}{\frac {n-k}{n-kz}}={\frac {k(n-k)}{(n-kz)^{2}}}
所以

{\frac {{\mathrm {d}}}{{\mathrm {d}}z}}G(z)=G(z)\left({\frac {n}{z}}+{\frac {1}{n-z}}+{\frac {2}{n-2z}}+{\frac {3}{n-3z}}\cdots +{\frac {n-1}{n-(n-1)z}}\right)
故此可得出

{\begin{aligned}\operatorname {E}(T)&=\left.{\frac {{\mathrm {d}}}{{\mathrm {d}}z}}G(z)\right|\_{{z=1}}\\&=G(1)\left(n+{\frac {1}{n-1}}+{\frac {2}{n-2}}+{\frac {3}{n-3}}\cdots +{\frac {n-1}{n-(n-1)}}\right)\\&=n+\sum \_{{k=1}}^{{n-1}}{\frac {k}{n-k}}\end{aligned}}
其中的連加部分可化簡：

\sum \_{{k=1}}^{{n-1}}{\frac {k}{n-k}}=\sum \_{{k=1}}^{{n-1}}\left({\frac {k}{n-k}}-{\frac {n}{n-k}}\right)+nH\_{{n-1}}=nH\_{{n-1}}-(n-1)
所以得出：
\operatorname {E}(T)=n+nH\_{{n-1}}-(n-1)=nH\_{{n-1}}+1=nH\_{n}

用機率生成函數可同時求取變異量。變異量可寫作

\operatorname {Var}(T)=\operatorname {E}(T(T-1))+\operatorname {E}(T)-\operatorname {E}(T)^{2}
其中

{\begin{aligned}\operatorname {E}(T(T-1))=&\left.{\frac {{\mathrm {d}}^{2}}{{\mathrm {d}}z^{2}}}G(z)\right|\_{{z=1}}\\=&\left[G(z)\left({\frac {n}{z}}+{\frac {1}{n-z}}+{\frac {2}{n-2z}}+{\frac {3}{n-3z}}\cdots +{\frac {n-1}{n-(n-1)z}}\right)^{2}\right.\\&\;\left.\left.+G(z)\left(-{\frac {n}{z^{2}}}+{\frac {1^{2}}{(n-z)^{2}}}+{\frac {2^{2}}{(n-2z)^{2}}}+{\frac {3^{2}}{(n-3z)^{2}}}\cdots +{\frac {(n-1)^{2}}{(n-(n-1)z)^{2}}}\right)\right]\right|\_{{z=1}}\\=&n^{2}H\_{n}^{2}-n+\sum \_{{k=1}}^{{n-1}}{\frac {k^{2}}{(n-k)^{2}}}\\=&n^{2}H\_{n}^{2}-n+\sum \_{{k=1}}^{{n-1}}{\frac {(n-k)^{2}}{k^{2}}}\\=&n^{2}H\_{n}^{2}-n+n^{2}H\_{{n-1}}^{{(2)}}-2nH\_{{n-1}}+(n-1).\end{aligned}}
故得出：

{\begin{aligned}\operatorname {Var}(T)&=\;n^{2}H\_{n}^{2}-1+n^{2}H\_{{n-1}}^{{(2)}}-2nH\_{{n-1}}+nH\_{{n-1}}+1-n^{2}H\_{n}^{2}\\&=\;n^{2}H\_{{n-1}}^{{(2)}}-nH\_{{n-1}}<{\frac {\pi ^{2}}{6}}n^{2}\end{aligned}}

參考文獻
----

* Paul Erdős and Alfréd Rényi, *On a classical problem of probability theory*, Magyar Tud. Akad. Mat. Kutato Int. Kozl, 1961.
* William Feller, *An introduction to Probability Theory and its Applications*, 1957.
* Michael Mitzenmacher and Eli Upfal, *Probability and Computing: Randomized Algorithms and Probabilistic Analysis*, Cambridge University Press, 2005
* Donald J. Newman and Lawrence Shepp, *The Double Dixie Cup Problem*, *American Mathematical Monthly*, Vol. 67, No. 1 (Jan. 1960), pp. 58–61.
* Philippe Flajolet, Danièle Gardy, Loÿs Thimonier *Birthday paradox, coupon collectors, caching algorithms and self-organizing search. （页面存档备份，存于）*, *Discrete Applied Mathematics*, Vol. 39, (1992), pp. 207–229

外部連結
----

* "Coupon Collector Problem （页面存档备份，存于）" by Ed Pegg, Jr. the Wolfram Demonstrations Project. Mathematica package.
* Coupon Collector Problem （页面存档备份，存于）, Java applet.
* *How Many Singles, Doubles, Triples, Etc. Should The Coupon Collector Expect? （页面存档备份，存于）*, a short note by Doron Zeilberger.
* （英文） getir indirim kodu（页面存档备份，存于）