幸运大转盘抽奖逻辑实现 | 您所在的位置:网站首页 › 转盘抽奖动画 › 幸运大转盘抽奖逻辑实现 |
文章目录
1. 需求2. 实现思路2.1 实现逻辑步骤2.2 计算中奖概率算法
3. 实现代码4. 其它问题处理4.1 奖项设置有次数限制4.2 奖项设置有总数量4.3 让大奖在前半段时间内不被抽到
5.总结
1. 需求
如图,实现一个转盘抽奖, 有个n个奖项,每个奖项配置中奖概率,点击开始抽奖进行抽奖; 本文主要讲后端抽奖逻辑算法; 2. 实现思路 2.1 实现逻辑步骤 前端使用现有的转盘插件 如 https://github.com/LuckDraw/vue-luck-draw后台能够添加配置抽奖的奖项,以及每个奖项的名称、数量、中奖概率前端调用接口查询所有奖项,初始化转盘点击开始抽奖,调用后端接口,接口计算中奖概率得到中奖奖项,返回中奖的奖项给前端,前端提示中奖 2.2 计算中奖概率算法下面会贴出概率计算的代码,封装成了工具类,可以直接在项目里面用; 这里讲思路。 举例: 奖项及中奖概率 苹果 10%,橘子 20%, 香蕉 15%, 柠檬 5%, 谢谢参与 35% 根据奖项概率生成区间(从0开始,累加当前奖项的概率) 分别如下: 苹果 [0,10) 橘子 [10,30) 香蕉 [30,45) 柠檬 [45,50) 谢谢参与 [50,85) 生成随机数,落在哪个区间,就返回对应的中奖项 3. 实现代码调用方式 public static void main(String[] args) { //实际上我们的奖项可能是个实体类;这面的map就是HashMap HashMap map = new HashMap(); map.put("苹果", 10); map.put("橘子", 20); map.put("香蕉", 15); map.put("柠檬", 5); map.put("波罗", 15); map.put("谢谢参与", 35); //直接调用工具类 RandomUtil WeightMeta md = RandomUtil.buildWeightMeta(map); //md.random()的结果就是奖项; System.out.println("恭喜你抽到了:"+md.random()); }概率计算工具类,调用方式参考里面的main方法 RandomUtil.java public class RandomUtil { /*** * @param weightMap key是奖项,value是概率 * @param * @return */ public static WeightMeta buildWeightMeta(final Map weightMap) { final int size = weightMap.size(); Object[] nodes = new Object[size]; int[] weights = new int[size]; int index = 0; int weightAdder = 0; for (Map.Entry each : weightMap.entrySet()) { nodes[index] = each.getKey(); weights[index++] = (weightAdder = weightAdder + each.getValue()); } return new WeightMeta((T[]) nodes, weights); } }奖项权重计算类 WeightMeta.java package com.happy.netshop.wechat.helper; import java.util.Arrays; import java.util.Random; public class WeightMeta { private final Random ran = new Random(); private final T[] nodes; private final int[] weights; private final int maxW; public WeightMeta(T[] nodes, int[] weights) { this.nodes = nodes; this.weights = weights; this.maxW = weights[weights.length - 1]; } /** * 该方法返回权重随机对象 * @return */ public T random() { int index = Arrays.binarySearch(weights, ran.nextInt(maxW) + 1); if (index if (ranInt > maxW) { ranInt = maxW; } else if(ranInt ranInt ++; } int index = Arrays.binarySearch(weights, ranInt); if (index StringBuilder l1 = new StringBuilder(); StringBuilder l2 = new StringBuilder("[random]\t"); StringBuilder l3 = new StringBuilder("[node]\t\t"); l1.append(this.getClass().getName()).append(":").append(this.hashCode()).append(":\n").append("[index]\t\t"); for (int i = 0; i |
CopyRight 2018-2019 实验室设备网 版权所有 |