题目
(百度)有一个很大很大的输入流,大到没有存储器可以将其存储起来,而且只输入一次,如何从这个输入流中随机取得m个记录。
解法
思路:使用一个大小为m的辅助数组array,初始化为前m个元素,然后通过如下规则替换m个元素。对新输入的m+1到n中的第N(N>m)个元素,生成一个随机数R=rondom(N),范围为1到N,如果0<R<m,则将当前的元素N替换到array[R]。
这套题的一个主要问题就是需要保证取到的m个数的概率是等概率的。那么如何证明这种方式是正确的(等概率的)?
(百度)有一个很大很大的输入流,大到没有存储器可以将其存储起来,而且只输入一次,如何从这个输入流中随机取得m个记录。
思路:使用一个大小为m的辅助数组array,初始化为前m个元素,然后通过如下规则替换m个元素。对新输入的m+1到n中的第N(N>m)个元素,生成一个随机数R=rondom(N),范围为1到N,如果0<R<m,则将当前的元素N替换到array[R]。
这套题的一个主要问题就是需要保证取到的m个数的概率是等概率的。那么如何证明这种方式是正确的(等概率的)?