您的位置:首页 > 其它

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

2012-10-11 08:46 204 查看
题目是这样子的:

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

 

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

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

解法:

 

C代码  


假设:i为当前记录序号,S所有采样,要求采样的数量为n,i = 1,2,3...  

  

1. 当i <= n的时候,都放到S  

2. 当i>n的时候,每次生成[1, i]均匀分布的随机数r,如果1<=r<=n,就用当前记录i替换掉S中第r个记录  

 

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

 

C代码  


A.  首先,假设当前S中的样本都是符合题目要求的 那么显然,每个新到的记录有n/i的概率被选中,符合题目要求(题目要就就是一共有m个元素的话,那么每个元素被选中的概率都应该是n/m)  

B.  再看之前就在S中的记录,因为假设符合要求,那么S中的一个元素,在i到来之前,是以 n/(i-1)的概率选出的,i到来后,它被抽到去掉的概率是1/i,那么保留的概率是(i-1)/i,这样最终它在S中的概率就是(n/(i-1))  * ( (i-1)/i) = n/i  

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c