编程珠玑——Floyd随机抽样

对于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=上一轮被选中的概率+上一轮
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值