从 N 条记录的文件中随机 select M 条记录

randomly select M records from a file of N records

需要从一个有N条记录(N>M)的文件中随机selectM条记录(即文件中每条记录有相同的概率被选择)。想知道是否有只读取文件一次的解决方案?

我想到的唯一方法是select每条记录的概率为M/N,但这种方法可能导致少于M条记录或多于M条记录。

欢迎任何更聪明的想法。

此致, 林

Select M unique个随机数,放到一个数组中,排序,然后一次读取文件。当你读入文件的第 i 条记录时,如果 i 在数组中则保留它,否则丢弃它。这需要 O(M) 内存,并且是 运行 时间 O(N + M log M)

您可能需要的是水库采样算法 (link)。

它不仅允许您以相同的概率准确地获得 M 条记录,而且您只需要读取一次输入,而无需事先知道 N。

复杂度为 O(N)。