十分钟让你明白蓄水池算法

蓄水池算法


1、蓄水池原理

如图,一个游泳池,池内水是活水,也就是有水不断地进入,也有一端不断往外流出,理论上池中水会被全部替换,其实随着水流的流动,会存在一部分水还是之前的水,有一部分会被替换,这也就是蓄水池算法的思想
十分钟让你明白蓄水池算法_第1张图片


2、蓄水池算法解析⭐

蓄水池算法一般用于大量数据,数据流处理,对数据进行一次读取,公平随机抽样。假设一个抽奖场景,设置三个中将名额,规定期间不断有人进行抽奖,直到开奖日,才停止抽奖,进行开奖。
十分钟让你明白蓄水池算法_第2张图片


3、Java代码实现

通过从100个数字中随机抽取5个数据为例,编写代码如下:

/*蓄水池抽样算法模拟*/
public class Sampling {
    //定义一个中奖的集合
    List<Integer> list;
    //随机数
    Random random;
    //设置中奖名额
    public final Integer number;

    //初始化
    public Sampling(int n){
        number=n;
        list=new ArrayList<>(n);
        random=new Random();
    }

    //抽水池算法
    public void samping(int num){
        if (num<number){
            list.add(num);
        }else{
            int rand = random.nextInt(num);
            if(rand<number){
                list.set(random.nextInt(number),num);
            }
        }
    }

    public static void main(String[] args) {
        //测试 1~100随机抽5个数
        Sampling sampling=new Sampling(5);
        for (int i = 0; i < 100; i++) {
            sampling.samping(i);
        }
        sampling.list.forEach(System.out::println);
    }
}

十分钟让你明白蓄水池算法_第3张图片


你可能感兴趣的:(Java+大数据之旅,日常一学,算法)