1. 程式人生 > >從n個物件中隨機選擇一個

從n個物件中隨機選擇一個

現在有n個物件,讓從裡隨機選擇一個是非常簡單的。最直接的方法是產生一個1~n的隨機數就可以了。但是現在如果我告訴你,n是不確定的,又該怎麼做?

現在問題變為:

如何從事先不知道文字檔案行數的情況下讀取該檔案,從中隨機選擇一行並輸出?

這個題目看上去比原來的問題有意思的多。答案也十分有趣:

i = 0

while more input lines

   with probability 1.0 / ++i

         choice = this input line

print choice

摘自《程式設計珠璣》第二版

第一行被選中的概率為1,第二行被選中的概率為1/ 2, ..., 第k行被選中的概率為1 / k ,

但是第1行保持被選中,不被後面的行覆蓋的概率就是最終的概率: 1 * 1 / 2 * 2 / 3 * 3 / 4 * ... * (n - 1) / n = 1 / n

         第2行保持被選中,不被後面的行覆蓋的概率就是最終的概率:1 / 2 * 2 / 3 * 3 / 4 * ... * (n - 1) / n = 1 / n

         第3行保持被選中,不被後面的行覆蓋的概率就是最終的概率: 1 / 3 * 3 / 4 * 4 / 5 * ... * (n - 1) / n = 1 / n

         ...

        第n行保持被選中,不被後面的行覆蓋(後面沒有文字了)的概率就是最終的概率:1 / n

按照上面的策略,每行被最終選中輸出的概率為 1 / n