现在有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