【从字符串流中随机选择一个字符串】
解题的核心是在幸存的字符串中挑选,并在过程中不断更新。
你打开文件并保存第一个字符串,此时有了一个备选字符串,并有100%的可能性选中它。保存这个字符串,继续读入下一个字符串,这样就有了2个备选字符串,选中每个的可能性都是50%。选中其中之一并保存,然后丢弃另一个。再读入下一个字符串,按照新字符串的33%原先幸存字符串67%的概率,在两者之间选择一个,然后保存新选中的字符串。
【扩展】
如何从字符串流中随机选取1000个字符串。
对于数据流中的前1000个关键字,显然都要放到数组中。
对于数据流中的的第n(n>1000)个关键字,我们知道这个关键字被随机选中的概率为1000/n。所以我们以1000/n的概率用这个关键字去替换数组中的随机一个。这样就可以保证所有关键字都以1000/n的概率被选中。