幸运大转盘抽奖逻辑实现 您所在的位置:网站首页 转盘抽奖动画 幸运大转盘抽奖逻辑实现

幸运大转盘抽奖逻辑实现

2023-12-31 20:04| 来源: 网络整理| 查看: 265

文章目录 1. 需求2. 实现思路2.1 实现逻辑步骤2.2 计算中奖概率算法 3. 实现代码4. 其它问题处理4.1 奖项设置有次数限制4.2 奖项设置有总数量4.3 让大奖在前半段时间内不被抽到 5.总结

1. 需求

image-20210225172727530

如图,实现一个转盘抽奖,

有个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 实验室设备网 版权所有