JAVA实现抽奖大转盘摇一摇核心算法 亲测实用
公司最近市场活动需求频繁更新 什么抽奖活动 大转盘 摇一摇 各种活动 活动类型各种各样但是都是通过概率去算出来是否中将废话不多说 新手上路 大神勿喷
实体类
public class AnniversaryPrizePool {//序号private int index;//中奖概率private BigDecimal winningProbability;//奖品Idprivate Integer prizeId;//奖品名称private String giftName;public int getIndex() {return index;}public void setIndex(int index) {this.index = index;}public BigDecimal getWinningProbability() {return winningProbability;}public void setWinningProbability(BigDecimal winningProbability) {this.winningProbability = winningProbability;}public Integer getPrizeId() {return prizeId;}public void setPrizeId(Integer prizeId) {this.prizeId = prizeId;}public String getGiftName() {return giftName;}public void setGiftName(String giftName) {this.giftName = giftName;}public AnniversaryPrizePool(int index, BigDecimal winningProbability, Integer prizeId, String giftName) {this.index = index;this.winningProbability = winningProbability;this.prizeId = prizeId;this.giftName = giftName;}@Overridepublic String toString() {return "AnniversaryPrizePool{" +"index=" + index +", winningProbability=" + winningProbability +", prizeId=" + prizeId +", giftName='" + giftName + '\'' +'}';}
核心算法
/*** 抽奖* @param anniversaryPrizePools 原始的概率列表,保证顺序和实际物品对应* @return 物品的索引*/public static int lottery(List<AnniversaryPrizePool> anniversaryPrizePools) {//扩大倍数int mulriple = 100;BigDecimal now = BigDecimal.ZERO;for (AnniversaryPrizePool anniversaryPrizePool : anniversaryPrizePools) {//所有概率加起来now = now.add(anniversaryPrizePool.getWinningProbability());}//概率乘以倍数mulriple = now.multiply(new BigDecimal(mulriple)).intValue();int lastScope = 0;// 洗牌,打乱奖品次序Collections.shuffle(anniversaryPrizePools);Map<Integer, int[]> prizeScopes = new HashMap<Integer, int[]>();for (AnniversaryPrizePool anniversaryPrizePool : anniversaryPrizePools) {int prizeId = anniversaryPrizePool.getPrizeId();// 划分区间int currentScope = lastScope + anniversaryPrizePool.getWinningProbability().multiply((new BigDecimal(mulriple).divide(now,0,BigDecimal.ROUND_HALF_UP))).intValue();prizeScopes.put(prizeId, new int[] { lastScope + 1, currentScope });lastScope = currentScope;}//获得随机的概率int luckyNumber = new Random().nextInt(mulriple);int luckyPrizeId = 0;// 查找随机数所在的区间if ((null != prizeScopes) && !prizeScopes.isEmpty()) {Set<Map.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]) {luckyPrizeId = key;break;}}}return luckyPrizeId;}
算法实现
首先把所有的商品中间的概率相加然后扩大多少倍我这里是扩大一百倍 扩大倍数可以根据自己的需求去扩大 然后打乱次序
然后获取随机数划分区间
看测试
public static void main(String[] args) {List<AnniversaryPrizePool> anniversaryPrizePoolsList = new ArrayList<AnniversaryPrizePool>();anniversaryPrizePoolsList.add(new AnniversaryPrizePool(1, new BigDecimal(0.4), 1, "再来一次"));anniversaryPrizePoolsList.add(new AnniversaryPrizePool(2, new BigDecimal(0.3), 3, "本站VIP一年"));anniversaryPrizePoolsList.add(new AnniversaryPrizePool(3, new BigDecimal(0.5), 0, "谢谢参与"));anniversaryPrizePoolsList.add(new AnniversaryPrizePool(4, new BigDecimal(0.2), 5, "50金币"));anniversaryPrizePoolsList.add(new AnniversaryPrizePool(5, new BigDecimal(0.1), 6, "Iphone 6"));anniversaryPrizePoolsList.add(new AnniversaryPrizePool(6, new BigDecimal(0), 7, "Ipad Air2"));anniversaryPrizePoolsList.add(new AnniversaryPrizePool(7, new BigDecimal(0), 8, "100元手机话费"));double num = 100;int index = 0;int indexs = 0;for (int i = 0; i < num; i++) {int lottery = LotteryUtil.lottery(anniversaryPrizePoolsList);index = index + 1;}System.out.println("第" + index + "抽奖");System.out.println("谢谢参与次数为:"+indexs);}
所谓概率不是百分百精准 也就是说众生平等 这里这概率设置为0的就怎么抽都抽不到
既然说到了概率不会是百分百精准 在实际场景中我们的商品还有一个库存的概念也就是说你中奖了但是库存不足也会是谢谢参与
JAVA实现抽奖大转盘摇一摇核心算法 亲测实用相关推荐
- Redis 抽奖大转盘的实战示例
本文主要介绍了Redis 抽奖大转盘的实战示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下.编程学习资料点击领取 目录 1. 项目介绍 2. 项目演示 3. 表结 ...
- css3抽奖转盘,从零制作CSS3抽奖大转盘
今天的任务是做一个纯CSS3的还算比较漂亮的抽奖大转盘,也就是下图效果. 我只说思路和重要的CSS3代码. Paste_Image.png 外盘 外盘是指有彩灯的深橙色圆环,以及圆环的外边线. 外盘设 ...
- 用c语言写抽奖大转盘,iOS抽奖大转盘的二种实现方法
有个朋友需要写个抽奖大转盘的功能,就让我帮忙写了下.我用了2种方法实现了效果,在这里和大家一起分享下. 一.一键转动大转盘 我一开始拿到手的是一堆的图片,然后自己花了点时间,搭建出美工要求的UI,接下 ...
- javaScript实现抽奖大转盘(一)
今天试了试自己写个抽奖大转盘. 先是借了两张别人的图片: 下面是布局部分: <div class="round"><div class="box&quo ...
- 微信小程序独家秘笈之抽奖大转盘
代码地址如下: http://www.demodashi.com/demo/14209.html 一.前期准备工作 软件环境:微信开发者工具 官方下载地址:https://mp.weixin.qq.c ...
- 抽奖大转盘-React-移动端
抽奖大转盘-React-移动端 react安装 修改项目结构 配置路由 删除一些不必要的文件 大转盘 整理代码结构和一些静态资源 书写静态页面 移动端px-rem转换 静态页面 静态页面样式 抽奖大转 ...
- 优秀课程案例:使用Scratch制作一个抽奖大转盘方法二!
点击上面微信号关注我关注我哟每天坚持早上9:00左右推送文章,争取做到日更,喜欢的可以设置星标,并分享点赞我们的文章,非常感谢大家的支持,您的点击的在看就是我们的动力! 昨天我们分享了一个抽奖大转盘: ...
- jQuery实现简单抽奖大转盘
上效果!!! 初始页面效果 点击开始后效果 上代码 <!DOCTYPE html> <html lang="en"> <head><met ...
- vue幸运抽奖大转盘的丑绝实现
自己通过canvas+vue(vue不是必备的可以)实现的一个抽奖转盘,重点在实现逻辑,所以样式丑绝. 基本效果图,中间指针可以替换为图片 数据格式 转盘的分块由传入的数组长度确定,分为4,6,8块还 ...
最新文章
- PHP中绘制图像的一些函数总结
- informatica 参数文件配置
- java camel from uri_java – 如何将Camel属性加载到Bean中?
- linux系统根分区挂载出错 系统无法,用虚拟机安装linux时显示“没有定义根文件系统,请到分区菜单以修正此错误”,是什么意思,肿么弄谢谢各位...
- luogu P4240 毒瘤之神的考验(莫比乌斯反演+递推前缀和+数论分块)
- php文件锁 阻塞区别,php文件锁阻塞模式和非阻塞模式
- canvas笔记-文字渲染
- 诗与远方:无题(四十三)- 幼稚肤浅
- SQL SERver2005中row_number() 的用法
- kali Linux的安装
- 19. 删除链表的倒数第N个节点【双指针经典应用】详解
- java 清除所有 Session
- TPLinker 实体关系抽取代码解读
- c语言头文件写法,C语言头文件正确写法
- java创建mysql视图_Mysql视图的创建及使用
- android6.0 power按键深入分析
- 【NLP】第 1 章 语言处理和 Python
- 验收测试:α测试、β测试
- 骨传导耳机和普通耳机危害哪个小?骨传导耳机
- r语言入门——颜色转换