首页 > 代码库 > 蓄水池抽样Reservior Sampling

蓄水池抽样Reservior Sampling

编程珠玑第12章练习题10:

如何从n个对象(可以依次看到这n个对象,但事先不知道n的值)中随机选择一个?具体说来,如何在事先不知道文本文件行数的情况下读取文件,从中随机选择并输出一行?

解答:我们总选择 第1行,并以概率1/2选择第2行,以概率1/3选择第3行,依次类推,在这一过程结束时,每一行选中的概率是相等的(都是1/n,其中n是文件的总行数)

i = 0;while more input lines    with probability 1.0/++i            choice = this input lineprint choice

推广:

如何从未知或者很大样本空间随机地取k个数?

for i=k+1:n   m = random(1,i);  //inclusive   if(m<=k)     swap(array[m],array[i]);end print array[1:k]

 

                       --------------引用http://www.cnblogs.com/HappyAngel/archive/2011/02/07/1949762.html