本文实例为大家分享了java抽奖算法,供大家参考,具体内容如下
1. 算法分析
根据概率将奖品划分区间,每个区间代表一个奖品,然后抽取随机数,反查落在那个区间上,即为所抽取的奖品。
2. 代码
核心算法
public class Arithmetic { // 放大倍数 private static final int mulriple = 1000000; public int pay(List<Prize> prizes) { int lastScope = 0; // 洗牌,打乱奖品次序 Collections.shuffle(prizes); Map<Integer, int[]> prizeScopes = new HashMap<Integer, int[]>(); Map<Integer, Integer> prizeQuantity = new HashMap<Integer, Integer>(); for (Prize prize : prizes) { int prizeId = prize.getPrizeId(); // 划分区间 int currentScope = lastScope + prize.getProbability().multiply(new BigDecimal(mulriple)).intValue(); prizeScopes.put(prizeId, new int[] { lastScope + 1, currentScope }); prizeQuantity.put(prizeId, prize.getQuantity()); lastScope = currentScope; } // 获取1-1000000之间的一个随机数 int luckyNumber = new Random().nextInt(mulriple); int luckyPrizeId = 0; // 查找随机数所在的区间 if ((null != prizeScopes) && !prizeScopes.isEmpty()) { Set<Entry<Integer, int[]>> entrySets = prizeScopes.entrySet(); for (Map.Entry<Integer, int[]> m : entrySets) { int key = m.getKey(); if (luckyNumber >= m.getValue()[0] && luckyNumber <= m.getValue()[1] && prizeQuantity.get(key) > 0) { luckyPrizeId = key; break; } } } if (luckyPrizeId > 0) { // 奖品库存减一 } return luckyPrizeId; } }
Prize bean
public class Prize { /** * 奖品唯一标示 */ private Integer prizeId; /** * 中奖概率 */ private BigDecimal probability; /** * 奖品数量 */ private Integer quantity; public Integer getPrizeId() { return prizeId; } public void setPrizeId(Integer prizeId) { this.prizeId = prizeId; } public BigDecimal getProbability() { return probability; } public void setProbability(BigDecimal probability) { this.probability = probability; } public Integer getQuantity() { return quantity; } public void setQuantity(Integer quantity) { this.quantity = quantity; } }
3. 测试
prize1概率: 5%
prize2概率: 10%
prize3概率: 15%
prize4概率: 20%
prize5概率: 50%
public class Test { public static void main(String[] args) { List<Prize> prizes = new ArrayList<Prize>(); Prize prize1 = new Prize(); prize1.setPrizeId(1); prize1.setProbability(new BigDecimal(0.05)); prize1.setQuantity(1); prizes.add(prize1); Prize prize2 = new Prize(); prize2.setPrizeId(2); prize2.setProbability(new BigDecimal(0.10)); prize2.setQuantity(10); prizes.add(prize2); Prize prize3 = new Prize(); prize3.setPrizeId(3); prize3.setProbability(new BigDecimal(0.15)); prize3.setQuantity(20); prizes.add(prize3); Prize prize4 = new Prize(); prize4.setPrizeId(4); prize4.setProbability(new BigDecimal(0.20)); prize4.setQuantity(50); prizes.add(prize4); Prize prize5 = new Prize(); prize5.setPrizeId(5); prize5.setProbability(new BigDecimal(0.50)); prize5.setQuantity(200); prizes.add(prize5); int prize1GetTimes = 0; int prize2GetTimes = 0; int prize3GetTimes = 0; int prize4GetTimes = 0; int prize5GetTimes = 0; Arithmetic arithmetic = new Arithmetic(); int times = 1000; for (int i = 0; i < times; i++) { int prizeId = arithmetic.pay(prizes); switch (prizeId) { case 1: prize1GetTimes++; break; case 2: prize2GetTimes++; break; case 3: prize3GetTimes++; break; case 4: prize4GetTimes++; break; case 5: prize5GetTimes++; break; } } System.out.println("抽奖次数" + times); System.out.println("prize1中奖次数" + prize1GetTimes); System.out.println("prize2中奖次数" + prize2GetTimes); System.out.println("prize3中奖次数" + prize3GetTimes); System.out.println("prize4中奖次数" + prize4GetTimes); System.out.println("prize5中奖次数" + prize5GetTimes); } }
结果:
通过1000次抽取,我们看出算法精度还是很高的。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
本文向大家介绍Java抽奖抢购算法,包括了Java抽奖抢购算法的使用技巧和注意事项,需要的朋友参考一下 本文示例为大家分享了Java抽奖抢购算法,供大家参考,具体内容如下 应用场景 单件奖品抢购(可限时) 多件奖品按概率中奖(可限时、可不限量) 代码实现 表结构: 代码: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。
抽奖互动能够有效活跃直播间气氛,吸引更多观众参与直播互动 讲师端 说明: 1)自定义奖品名称:发起抽奖时可自定义抽奖名称,观看端进行显示 2)参与用户:可选择全部在线用户或本次直播未中奖用户参与抽奖(一场直播中,累计中奖人数不能超过2000人,否则发起抽奖时,如参与用户设置为未中奖用户则无法发起) 3)中奖人数:支持一次性抽取1-200个中奖用户 4)预设中奖用户:可基于在线用户列表提前选择中奖用
获取抽奖信息 Mudu.Room.LuckyDraw.Get(function (response) { response = JSON.parse(response) if (response.status === 'y') { console.log('获取成功,数据为:', response.data) } if (response.status === 'n') {
本文向大家介绍PHP抽奖算法程序代码分享,包括了PHP抽奖算法程序代码分享的使用技巧和注意事项,需要的朋友参考一下 抽奖算法需要满足的需求如下: 1.可以控制中奖的概率 2.具有随机性 3.最好可以控制奖品的数量 4.根据用户ID或者ip、手机号、QQ号等条件限制抽奖次数 初期就这些需求,然后根据网上的资料,采用了一种阶段式抽取的方法,大家下面看一下整体的程序: 该程序是在ThinkPHP框架下完
本文向大家介绍PHP实现转盘抽奖算法分享,包括了PHP实现转盘抽奖算法分享的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了PHP实现转盘抽奖算法的具体代码,供大家参考,具体内容如下 流程: 1.拼装奖项数组 2.计算概率 3.返回中奖情况 代码如下: 中奖概率 ' v ' 可以在后台设置,传到此方法中,注意传整数 效果图: 想要学习更多关于抽奖功能的实现,请参考此专题:抽奖功能 以上
抽奖 调用抽奖,异步接口。若使用TidaSDK自带UI,则不用关心结果是什么,直接将结果缓存下来。调用Tida.showDrawResult时传入回调结果即可。 若需要定制化UI,有关结果数据结构见下面注释 /** * Tida.draw 抽奖接口回调 * @callback Tida~drawCallback * @param {object} result 结果数据对象 * @para