编程珠玑——Floyd随机抽样

本文探讨了Floyd随机抽样的算法原理,并阐述了其在编程实践中的具体运用,通过公式p=(m-1)/n-1+(n-m)/(n-1)*1/n=m/n详细解释了该算法如何实现概率为m/n的随机抽样。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于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=上一轮被选中的概率+上一轮未被选中的概率*本轮被选中的总概率
         易得P=(m-1)/(n-1)*1+(n-m)/(n-1)*1/n=m/n.
          上一轮被选中的概率:由[m-
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值