1. 程式人生 > >用概率告訴你:集齊 “五福” 要多久

用概率告訴你:集齊 “五福” 要多久

問題描述: Suppose that each coupon obtained is, independent of what has been previously obtained, equally likely to be any of m different types. Find the expected number of coupons one needs to obtain in order to have at least one of each type. Hint: Let X be the number needed. It is useful to represent X by X

=iXiX = \sum_i X_iwhere each XiX_i is a geometric random variable. (問題來源:《Introduction to Probability Models 10th Edition》習題2.42)

中文描述:

假設在一次抽獎活動中,你需要集齊 m 種卡片,每次抽中任意型別卡片的概率是相等的,即1m\frac{1}m 。那麼要集齊所有型別,平均要抽多少次?

背景知識(幾何分佈):

這道題第一次做還是費一點腦力的,即便題目給了提示:考慮 m 個幾何分佈的和,但其實容易帶來誤導。

對於幾何分佈,大家都非常瞭解。每次試驗成功的概率是 p,則直到第 n 次試驗才第一次成功的概率服從幾何分佈 P(n):

1

Suppose that independent trials, each having probability p of being a success, are performed until a success occurs. If we let X be the number of trials required until the first success, then X is said to be a geometric random variable with parameter p. Its probability mass function is given by P(

n)=P{X=n}=(1p)n1p,n=1,2,...P(n) = P\{X = n\} = (1 − p)^{n−1}p, n = 1, 2, . . . 在本題中只需要用到它的期望: E[X]=n=1infnp(1p)n1=1/pE[X] = \sum_{n=1}^{\inf}np(1 − p)^{n−1}=1/p 也就是說平均需要 1/p 次試驗才能成功,這非常直觀明顯,假設成功的概率是1/3,那平均嘗試3次就能成功。

解答:

先從簡單情況分析:

  • 假設只有 1 種福卡,那隻需要抽1次就集齊了。
  • 假設有 2 種福卡呢?首先第一次一定可以抽中其中一種,那麼問題就變成了:還需要抽多少次才能抽中第二種?顯然這是幾何分佈問題:成功的概率 p = 1/2,那麼平均還需要再抽2次,所以總體上看,平均抽獎 1+2 = 3次就能集齊兩種福卡。
  • 假設有 m 種福卡呢?大家應該明白了,我們一種一種來數。 首先,抽中第一種福卡,需要 1 次; 接著,我們希望抽中一種和之前不同的卡片,那麼這個幾何分佈問題中成功的概率是 m1m\frac{m-1}m, 即抽中剩餘 m-1種的任意一種,失敗的概率是 1m\frac1m,即和第一次抽的一樣。那麼抽中第二種福卡,需要 1m1m=mm1\frac1{\frac{m-1}m}=\frac{m}{m-1}次; 接下來,規律自然就出來了,抽第三種福卡需要和之前兩種不同,那麼成功的概率是 m2m\frac{m-2}m,所以抽中第三種福卡,需要 1m2m=mm2\frac1{\frac{m-2}m}=\frac{m}{m-2}次; …… 最後,抽中第m種福卡,需要 m 次。 所以,總共需要i=0m1mmi=i=1mmi\sum_{i=0}^{m-1}\frac{m}{m-i}=\sum_{i=1}^{m}\frac{m}{i}

你可能有些遺憾,只能寫成級數形式,不過這就是最簡形式了。 如果你懷疑它的正確性,我們下面來做個簡單的模擬。

程式模擬:

import random
import matplotlib.pyplot as plt

def sim(m):
    count = 0
    round = 1000     #重複次數
    for i in range(round):
        l = [0 for i in range(m)]
        while True:
            count = count+1
            l[random.randint(0,m-1)] = 1
            if sum(l[:]) == m:     #全部集齊
                break
    return count/round

def func(m):
    temp = [m/i for i in range(1,m+1)]
    return sum(temp)

x = [i for i in range(1,10)]
y_simulation = [sim(i) for i in x]
y_target = [func(i) for i in x]
plt.plot(x,y_simulation,'b')   #藍線代表模擬結果
plt.plot(x,y_target,'or')   #紅點代表理論結果
plt.show()

實驗結果: 橫座標 代表“福卡”種數 縱座標 代表抽獎次數

在這裡插入圖片描述 非常完美! 現在你知道在等概率條件下,集齊贏大獎 之類遊戲要抽多少次了吧!當然,等概率條件在現實抽獎情況下往往是不存在的。 XD

  1. Introduction to Probability Models 10th Edition》p29 ↩︎