首页 > 编程语言 >蓄水池抽奖算法

蓄水池抽奖算法

时间:2023-07-11 10:00:29浏览次数:29  
标签:count 抽奖 int void 蓄水池 list 算法 num public

import java.util.ArrayList;

import java.util.List;

import java.util.Random;

/*

* 思路:蓄水池抽样算法

1.如果接收的数据量小于m,则依次放入蓄水池。

2.当接收到第i个数据时,i >= m,在[0, i]范围内取以随机数d,若d的落在[0, m-1]范围内,则用接收到的第i个数据去替换蓄水池中的第d个数据。

重复步骤2。

3.算法的精妙之处在于:当处理完所有的数据时,蓄水池中的每个数据都是以m/N的概率获得的。

* */

public class Pool<T> {

private final static Random random = new Random();

private List<T> list;// 中奖的人

private int num;// 池子大小

private int count;// 记录奖池处理了多少人

public List<T> getList() {

return list;

}

public void setList(List<T> list) {

this.list = list;

}

public int getNum() {

return num;

}

public void setNum(int num) {

this.num = num;

}

public int getCount() {

return count;

}

public void setCount(int count) {

this.count = count;

}

public static Random getRandom() {

return random;

}

public Pool(int n) {

this.num = n;

list = new ArrayList<T>(n);

}

private void add(T t) {

if (count < num) {

list.add(t);

count++;

} else {

final int rand = random.nextInt(++count);

if (rand < num) {

list.set(rand, t);// 替换

}

}

}

public static void test(){

// for (int i = 0; i <10000; i++) {//进行一万次

final Pool<Integer> award = new Pool<Integer>(10);//100个人抽10个奖

for (int j = 0; j < 100000; j++) {//每次100000人抽奖

award.add(j);

}

List<Integer> list = award.getList();

System.out.println("1万人的中奖人名单:"+list+"\n"+"参赛人数:"+award.getCount());

// }

}

public static void main(String[] args) {

test();

}

}

标签:count,抽奖,int,void,蓄水池,list,算法,num,public
From: https://www.cnblogs.com/waacode/p/17539414.html

相关文章

  • 禁忌搜索算法解决配电网无功优化问题对应的MATLAB源码,有对应的参考资料。
    禁忌搜索算法解决配电网无功优化问题对应的MATLAB源码,有对应的参考资料。电力系统配电网的无功优化规划是保证配电网安全、经济运行的一项有效手段,是降低网损、提高电压质量的重要措施。因此,电力系统配电网无功优化规划问题的研究,既具有理论意义,又具有工程实际应用价值。配电系统......
  • MATLAB程序采用非支配排序遗传算法(NSGA2)求解分布式电源选址定容问题,可作为一个有用的
    MATLAB程序采用非支配排序遗传算法(NSGA2)求解分布式电源选址定容问题,可作为一个有用的参考,程序注释明确,算法原理可以自己搜。YID:4120651507678049......
  • SVPWM算法(空间电压矢量)simulink仿真: 1.模块划分清晰,易于学习
    SVPWM算法(空间电压矢量)simulink仿真:1.模块划分清晰,易于学习和理解算法;2.采用7段式svpwm,用异步电机作为负载;3.赠送svpwm原理详解文档;4.提供技术解答,带你快速入门svpwm算法!ID:1111650238521053......
  • python代码:基于DDPG(深度确定性梯度策略)算法的售电公司竞价策略研究
    python代码:基于DDPG(深度确定性梯度策略)算法的售电公司竞价策略研究关键词:DDPG算法深度强化学习电力市场发电商竞价说明文档:完美复现英文文档,可找我看文档主要内容:代码主要研究的是多个售电公司的竞标以及报价策略,属于电力市场范畴,目前常用博弈论方法寻求电力市场均衡,但......
  • 线段树 算法笔记
    已知一个长度为\(n\)的序列\(a\),共有\(m\)次操作,每次操作如下:将某区间每一个数加上\(k\)。求出某区间每一个数的和。Luogu-P3372【模板】线段树1之前学过一个算法叫做树状数组,它的本质就是将一个\([1,x]\)的区间二进制拆分装化成若干个区间,数组里的每一个元素......
  • 基础推荐算法概述
    推荐系统可以解决什么问题? 推荐系统的性能可以直接或者间接的影响商品交易系统的成交额,也会影响到用户的购物体验。在实际场景中,用户自己往往也不完全知道自己想要什么,例如,有某银行的积分,想要在其app上兑换一些商品,那么我该兑换什么商品呢?某银行与很多汽车厂商合作,我想通过该......
  • 算法练习-day17
    二叉树110.平衡二叉树题意:给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。示例:思路:本题我们可以自下而上判断二叉树是否为平衡二叉树,以上图为示例,我们先判断15是不是平衡二叉树,很明显......
  • 【数据结构与算法】队列算法题
    TS实现队列interfaceIQueue<T>{//入队enqueue(item:T):void;//出队dequeue():T|undefined;//队首peek():T|undefined;//是否为空isEmpty():boolean;//大小size():number;}classArrayQueue<T>implementsIQueue<T>{......
  • 【数据结构与算法】栈相关算法题(长期更新)
    TS实现栈interfaceIStack<T>{push(e:T):void;pop():T|undefined;peek():T;isEmpyt():boolean;size():number;}//implements:实现接口,一个类可以实现多个接口classArrayStack<T>implementsIStack<T>{privatedata:T[]=[];//pri......
  • 「学习笔记」KMP 算法
    前置知识前缀是指从串首开始到某个位置\(i\)结束的一个特殊子串.真前缀指除了\(S\)本身的\(S\)的前缀.举例来说,字符串abcabeda的所有前缀为{a,ab,abc,abca,abcab,abcabe,abcabed,abcabeda},而它的真前缀为{a,ab,abc,abca,abcab,abcabe,abcabed}.......