博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
幸运大转盘抽奖 抽奖算法 程序实现逻辑
阅读量:5947 次
发布时间:2019-06-19

本文共 1993 字,大约阅读时间需要 6 分钟。

hot3.png

近期碰到的一个需求,实现一个类似大转盘抽奖的功能,需自定义奖项,各奖项中奖概率,当日抽奖最大次数,抽奖成本等。分享一个简单的java代码的实现的思路,有不足之处感谢各位指正。

3222d8e23d1b9889a6913d8d1fb14.png

初步方法

首先要定义几个奖品,例如:

  • iphone 中奖机率 10%
  • 100元购物卷 中奖机率 30%
  • 10元购物卷 中奖机率 50%

总的中奖机率是 10%+30%+50%=90%

剩余10%是谢谢惠顾,不中奖的

设计思路

这个是把所有商品按照概率分配到数组里面

  • A[0] = iphone
  • A[1] = iphone
  • A[2] = iphone
  • ...
  • A[10] = iphone

  • A[11] = 100元购物卷
  • A[12] = 100元购物卷
  • ...

然后随机一个0到99的数字,例如现在随机的数字是2

那么A[2]就是中奖的商品A[2] = iphone

//定义中奖率分母 百分之int probabilityCount = 100;  String[] prizesId = new String[probabilityCount];  //获取商品列表List
prizeInfoList = prizeInfoService.getPrizeInfo(); int num = 0; //循环所有商品for (AdPrizeInfo prize : prizeInfoList) { Integer probability = prize.getOdds(); //循环商品概率 for (int i = 0; i < probability; i++) { prizesId[num] = prize.getId(); num ++; }}//随机一个数字int index = (int) (Math.random() * probabilityCount); //获取到随机商品IDString prizeId = prizesId[index];

优化方法

设计思路

以上方法如果大概率的话,是很吃内存的,整理优化为一下方法:

ff890460e3fe6895416d64840985d.jpg

使用范围算法

//定义中奖率分母 百分之int probabilityCount = 100;  //最小概率值String min = "min";  //最大概率值String max = "max";  Integer tempInt = 0;  //待中奖商品数组Map
> prizesMap = new HashMap<>(); //获取商品列表List
prizeInfoList = prizeInfoService.getPrizeInfo(); for (AdPrizeInfo prize : prizeInfoList) { Map
oddsMap = new HashMap<>(); //最小概率值 oddsMap.put(min,tempInt); tempInt = tempInt + prize.getOdds(); //最大概率值 oddsMap.put(max,tempInt); prizesMap.put(prize.getId(),oddsMap);}//随机一个数字int index = (int) (Math.random() * probabilityCount); AdPrizeInfo prizeInfo = null; Set
prizesIds = prizesMap.keySet(); for(String prizesId : prizesIds){ Map
oddsMap = prizesMap.get(prizesId); Integer minNum = oddsMap.get(min); Integer maxNum = oddsMap.get(max); //校验index 再哪个商品概率中间 if(minNum <= index && maxNum > index){ prizeInfo = prizeInfoService.selectByPrimaryKey(prizesId); break; }}//如果为空,则没中奖if(prizeInfo == null){ prizeInfo = null;}

转载于:https://my.oschina.net/demons99/blog/2221320

你可能感兴趣的文章
[译] 学习如何构建自动化、跨浏览器的 JavaScript 单元测试
查看>>
根治JavaScript中的this-ECMAScript规范解读
查看>>
协议与代理之间的阐述
查看>>
Kubernetes 1.2.0 发布,Docker集群管理驶入快车道
查看>>
在CentOS下,利用FFMPEG对视频进行转码
查看>>
SublimeText3系列(3)- HTML-CSS-JS Prettify美化代码&Markdown Preview写作
查看>>
理解 Redux
查看>>
填一填用了半个月 ionic 遇到的坑
查看>>
[译] 用 Haskell 写简单的 Monadic Parser
查看>>
bling_hash——Node.js 字符串哈希的包
查看>>
谷歌 .dev 顶级域名正式开放
查看>>
Android Q 将获得大量的隐私保护功能
查看>>
Android Volley库源码简析(Image Request部分)
查看>>
Firefox 密码管理器 Lockbox 推出 Android 版
查看>>
视频点播-资源用量
查看>>
好程序员分享大势所趋 HTML5成Web开发者最关心的技术 ...
查看>>
北汽集团荣辉:抓不住自动驾驶 就抓不住车企的命脉 | 自动驾驶这十年 ...
查看>>
豆瓣评分8.8,这本程序员案头必备宝典,10年沉淀,新版再现 ...
查看>>
运行 Spring Boot 应用的 3 种方式!
查看>>
【内容安全】虚拟化及云环境下数据库审计优缺点分析
查看>>