前天晚上臥談時大家聊起來這個問題,討論無果後上網搜尋證明過程,發現並沒有什麼有理有據讓人信服的解釋。昨天經過思考後又經過討論,終於找到一個還算看的過去的證明。
問題
如何從0…n-1中隨機選擇m個整數,並且按照隨機順序輸出最後的結果?如果列表中允許出現重複的整數,如何才能生成一個有序列表?如果既允許重複又需要按照隨機順序輸出結果,那該怎樣?
書上的答案
我們總是選擇第一行,並使用二分之一的概率選擇第二行,使用三分之一的概率選擇第三行,以此類推。在該過程結束的時候,每一行具有相同的選中概率(1/n,其中n是文件中的總行數):
i=0
while more input lines
with probability 1.0/++i
choice = this input line
print choice
證明
按照僞代碼,我們使用一個變量choice來存儲選中的內容。
在讀入第k行時,用這行的概率
【1】當n=1時,選中1的概率爲1,此時choice中的內容爲第一行的內容。
【2】當n=2時,選中2的概率爲
【3】當n=3時,選中3的概率爲
……
【4】假設n=k時結論成立
【5】當n=k+1時,選中k的概率爲
在最後一步似乎還有部分不是很清楚的地方,歡迎指正