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
有一个文本,事先不知道数据行数,要求等概率抽出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
相关文章推荐
- 按概率返回0-N之间的数字的解法思想
- 等概率的抽取一个四位数 ,每次取一个,共取4次,4次组成一个4位数,拼起来为Set中的数
- 不独立事件的条件概率选取——[即时]抽取【JAVA SE】
- 由概率解法之树形图想到的
- java等概率的抽取一个四位数2
- 从N个不同数字中等概率取出M个数字(N>=M)
- ORACLE随机抽取记录,以及记录出现概率
- 求抽取扑克牌顺子的概率
- perl实现从一个文件中随机抽取n行
- 小用法,使用awk来对文件随机抽取n行
- 求解概率相关的题目的解法
- 从一个文件中随机抽取N行方法
- 一个笔试题,1000份卷子随机抽取100份,其中一种java解法
- 台湾大学公开课《概率》第五周一道不会作的作业题 ,一种看不懂的解法
- 属性抽取和打分:一种概率方法(ICDE2013)
- 用权值实现数据被抽取的概率
- 按概率(权重)抽取(显示)
- 台湾大学公开课《概率》第五周一道不会作的作业题 ,一种看不懂的解法
- 与概率相关的算法题C++解法(附证明过程)
- ZOJ3822 ACM-ICPC 2014 亚洲区域赛牡丹江赛区现场赛D题Domination 概率DP(两种解法)