N行中等概率抽取M行的解法

题目是这样子的:

有一个文本,事先不知道数据行数,要求等概率抽出1000行来,只准读1遍(即表示你对每一行的选择是二维的,要么要,要么不要,如果选择不要这一行那么再没有机会选择这一行了)

 

题目主要有两个难点,一个是保证等概率,另一个是对于当前行是要还是不要呢

这个题目的解法目前我只知道以下这种,如果你知道更多的解法,欢迎留言讨论

解法:

 

C代码   收藏代码
  1. 假设:i为当前记录序号,S所有采样,要求采样的数量为n,i = 1,2,3...  
  2.   
  3. 1. 当i <= n的时候,都放到S  
  4. 2. 当i>n的时候,每次生成[1, i]均匀分布的随机数r,如果1<=r<=n,就用当前记录i替换掉S中第r个记录  
 

那么对于该解法的证明如下

 

C代码   收藏代码
  1. A.  首先,假设当前S中的样本都是符合题目要求的 那么显然,每个新到的记录有n/i的概率被选中,符合题目要求(题目要就就是一共有m个元素的话,那么每个元素被选中的概率都应该是n/m)  
  2. B.  再看之前就在S中的记录,因为假设符合要求,那么S中的一个元素,在i到来之前,是以 n/(i-1)的概率选出的,i到来后,它被抽到去掉的概率是1/i,那么保留的概率是(i-1)/i,这样最终它在S中的概率就是(n/(i-1))  * ( (i-1)/i) = n/i  
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值