java 幸运大转盘_幸运大转盘抽奖 抽奖算法 程序实现逻辑
近期碰到的一个需求,实现一个类似大转盘抽奖的功能,需自定义奖项,各奖项中奖概率,当日抽奖最大次数,抽奖成本等。分享一个简单的java代码的实现的思路,有不足之处感谢各位指正。
初步方法
首先要定义几个奖品,例如:
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);
//获取到随机商品ID
String prizeId = prizesId[index];
优化方法
设计思路
以上方法如果大概率的话,是很吃内存的,整理优化为一下方法:
使用范围算法
//定义中奖率分母 百分之
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;
}
java 幸运大转盘_幸运大转盘抽奖 抽奖算法 程序实现逻辑相关推荐
- 摄影获得最佳图像的十大要诀_十大最佳应用程序性能管理工具
摄影获得最佳图像的十大要诀 Looking for Application Performance Management (APM) tools for your organization? Here ...
- 为什么不用python做大数据_光环大数据告诉你为什么说:人生苦短,我用Python
首先我们要说明的是本文不扯什么大道理,只是先介绍Python的背景,然后从实用的角度出发举一两个真实栗子. 首先要想了解要一门语言的好坏,或者为什么招程序员喜欢(卧槽,原来程序员喜欢不是女朋友?)我们 ...
- python幸运数字判断_幸运数字 小程序
问题描述:1-N个数字,每个数字的范围-9999到9999,把这N个数字排序后,删除奇数位的数,然后把剩余的数按原位置排序后继续删除奇数位,直到剩余一个数为止,剩余的数就是幸运数,输出幸运数和它最初的 ...
- python制作数据化大屏_可视化大屏经验分享
最近在实际项目中积累了一些经验,以及看到很多大神们的分享,不断学习和丰富关于大屏设计的特点及数据可视化的表达方式.以下经验来自于多处资源,希望对有这方面需求的同学有所帮助. 大屏显示的一些特点: 1. ...
- java常见性能优化_十大最常见的Java性能问题
java常见性能优化 Java性能是所有Java应用程序开发人员都关心的问题,因为快速使应用程序与使其正常运行同等重要. 史蒂文·海恩斯(Steven Haines)使用他在Java性能问题上的个人经 ...
- Java幸运盒子代码_幸运盒子扭蛋机小程序app开发
互联网产品是植根于互联网大环境的产品,幸运盒子扭蛋机小程序app开发是互联网产品的基本生长土壤.互联网的思想.原则和方法,必然以类似于"基因"继承的形式在每一个具体互联网产品中得以 ...
- java小鸡大冒险_小鸡大冒险怎么玩 新手攻略
小鸡大冒险是一款以小鸡为主视角展开的益智闯关游戏,那这款轻松可爱的游戏怎么玩呢?怎么样才算闯关成功呢?今天小编就带大家初步了解下这款游戏怎么玩! 进入游戏菜单后,点击一个关卡,就会出现如下的界面,描述 ...
- java小魔女大冒险_小魔女大冒险,小魔女大冒险下载,小魔女大冒险官网,礼包,活动,图片,评测,专区,论坛 - 酷酷跑手机游戏...
在这款游戏中,我们将化身为一名小魔女,用自己的魔法来拯救那些被困的小动物,下面我们先来看下游戏的操作. 点击想要让小魔女到达的地方,小魔女就会走到那个位置,当走到台阶前面时,随便点击屏幕上任意位置,小 ...
- java小鸡大冒险_小鸡大冒险
游戏介绍 一款独特的横版冒险的小鸡游戏,游戏中玩家要控制一个小鸡在一个充满危险的小房间里,面对各种关卡前行,周围会不断的出现阻扰你前面的各种武器道具,小心谨慎的过关前提下,不燃你可能就血腥当场了,多趣 ...
- java勇者大冒险_勇者大冒险 第一集 开车时英文歌 什么名
满意答案 zpjpXzd3 2016.01.01 采纳率:53% 等级:8 已帮助:361人 Lucky me lucky you A victory for your chosen Danci ...
最新文章
- 5页面返回上个页面定位_5个步骤,画好页面流程图
- 百度离职员工吐槽:整天除了工作还要演好戏,拍马屁,心太累!
- 安卓高手之路之java层Binder
- B-JUI(Best jQuery UI) 前端框架
- Matlab 常用运算符的用法和功能
- linux-基本权限UGO-读写执行权限
- 几种SQL取日期部分的方法
- 求cluster的质心坐标
- 曲线组合图 类型详情
- 信息处理工具计算机.ppt,第二课_计算机信息处理工具讲述.ppt
- chrome升级后无高级-断续访问
- 漫城cms免费漫画+小说cms系统
- 几个免费的英文文献的网站
- 显示器带宽测试软件,三种常见的上行带宽测试方法
- matlab自由落体程序,基于MATLAB的自由落体运动仿真.pdf
- 零基础入门语音识别-食物声音识别
- mysql报错:check the manual that corresponds to your MySQL server version for the right syntax to use
- HSV颜色空间和RGB颜色空间相互转换C语言实现
- go语言泛型在IDE中语法报错
- Linux进程中Dec04什么意思,Linux下缩小可执行程序 (一) 非使用符号的去除
热门文章
- vmware虚拟机安装win11系统教程
- 图形美不胜收,25 个可视化案例,Matplotlib 始终都是数据可视化绕不开的 Python 库
- IT程序员常去的论坛、社区、网站有哪些?
- linux 快速查找文件
- 计算机怎么快速匹配,四种方法教您如何在Excel中快速查找重复数据
- 15个国外最佳免费图片素材网站,快让小伙伴都知道
- Mysql如何跨库查询数据?
- nssa和stub_华为stub、nssa区域配置
- centos查看内存使用最多_CentOs中查看内存插槽数、最大容量和频率 查看内存插槽数、最大容量和频率...
- 【机器学习】分类决策树基本介绍+代码实现