对于n个样本,如何均匀随机的取出m个样本?即n个样本中每个样本都能有m/n的概率被取中。
1.简单插入取样
这是最基本,最直观的方法。在一个初始为空的集合中插入1~n的随机整数,知道个数为m个为止。但这个方法有个弱点,就是要插入一个数时,判断集合中是否存在该数,如果其存在,则要继续取样直到取到一个不在原集合中的数,重复取样需要很大的开销,而且越到后来开销越大。
2.Floyd取样(将第n个数插入与前n-1个数的样本的选取关联起来)
Floyd取样是大名鼎鼎的Robert W. Floyd提出来的。其基本思想:当已经在[1,n-1]个区间中已随机取出m-1个样本时,这时,生成一个1~n的随机数,如果该数落在原来的m-1个样本中,则样本集合加入n;如果不落在原来的m-1个样本中,那么就将随机数加入已取样本集合。这样的算法复杂度为O(m)
证明:归纳法证明
假设floyd算法在[m-1,n-1]时任意一个数被选中的概率是m-1/n-1. 则当[m,n]时
1. 对于第n个数,其被选中的概率为1/n+(m-1)/n=m/n; n被选中有两个可能,一个是随机数在m-1个样本里,则概率为
m-1/n。另一种是不在,则将随机数加入,随机数为n的概率为1/n。所以总的概率为1/n+(m-1)/n=m/n;
2. 对于前面 n-1个数中的任意一个数,总被选中的概率P=上一轮被选中的概率+上一轮
1.简单插入取样
这是最基本,最直观的方法。在一个初始为空的集合中插入1~n的随机整数,知道个数为m个为止。但这个方法有个弱点,就是要插入一个数时,判断集合中是否存在该数,如果其存在,则要继续取样直到取到一个不在原集合中的数,重复取样需要很大的开销,而且越到后来开销越大。
2.Floyd取样(将第n个数插入与前n-1个数的样本的选取关联起来)
Floyd取样是大名鼎鼎的Robert W. Floyd提出来的。其基本思想:当已经在[1,n-1]个区间中已随机取出m-1个样本时,这时,生成一个1~n的随机数,如果该数落在原来的m-1个样本中,则样本集合加入n;如果不落在原来的m-1个样本中,那么就将随机数加入已取样本集合。这样的算法复杂度为O(m)
证明:归纳法证明
假设floyd算法在[m-1,n-1]时任意一个数被选中的概率是m-1/n-1. 则当[m,n]时
1. 对于第n个数,其被选中的概率为1/n+(m-1)/n=m/n; n被选中有两个可能,一个是随机数在m-1个样本里,则概率为
m-1/n。另一种是不在,则将随机数加入,随机数为n的概率为1/n。所以总的概率为1/n+(m-1)/n=m/n;
2. 对于前面 n-1个数中的任意一个数,总被选中的概率P=上一轮被选中的概率+上一轮