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

蓄水池算法


1、蓄水池原理

如图,一个游泳池,池内水是活水,也就是有水不断地进入,也有一端不断往外流出,理论上池中水会被全部替换,其实随着水流的流动,会存在一部分水还是之前的水,有一部分会被替换,这也就是蓄水池算法的思想
在这里插入图片描述


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);
    }
}

在这里插入图片描述


  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

每日小新

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值