/**
* 蓄水池抽样。
* 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个元素,每个元素进池概率相等。
*
*
* 蓄水池抽样。
* 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);
}
}
}
1085

被折叠的 条评论
为什么被折叠?



