您的位置:首页 > 其它

蓄水池抽样

2013-07-03 10:08 225 查看
/**

* 蓄水池抽样。

* n个元素,随机选择k个,要求每个元素被选中的概率相等。n未知。

* 结论是每个元素被选中的概率都是k/n。数学归纳法证明如下:

* 选开始的k个元素进池,

* 令i=k+1,利用交换法,第k+1个元素进池的概率为 k/(k+1),原来池中的任意一个元素出池的概率为1/(k+1),留在池中的概率为k/k+1

* 结论当i成立。

* 当i成立,证明i+1也成立。

* 同理,第i+1个元素进池的概率为 k/i+1,前i个元素中的任意一个进池的概率为k/i,出池的概率为1/i+1,留在池中的概率为

* k/i * (1-1/i+1) = k/i * i/i+1 = k/i+1

*

* 结论成立。

* 表面上,每个元素进池概率在递减,但是存在出池概率,即当进入一个新元素时,对于该元素,发生一次独立事件,留在池中概率为k/i+1,

* 而对于它前面一个元素,发生两次独立事件,

* 第一次该元素被选入池中,概率为k/i,第二次该元素没有被选中交换出池,概率为i/i+1, 故留在池中概率为也为k/i+1。

*

* 实践意义,对于输入流,依次处理读入每个元素,对每个元素都采取k/i概率进池,即可保证最终的n个元素,每个元素进池概率相等。

*

*

*/

public void sampling(int[] a, int n, int k){
for (int i=k+1; i<=n; i++){
int m = random(1, i);
if(m <= k){
Tools.swap(a, m, i);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: