從n個物件中隨機選擇一個
阿新 • • 發佈:2019-02-01
現在有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