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 大转盘算法_幸运大转盘抽奖 抽奖算法 程序实现逻辑相关推荐
- Python_机器学习_算法_第1章_K-近邻算法
Python_机器学习_算法_第1章_K-近邻算法 文章目录 Python_机器学习_算法_第1章_K-近邻算法 K-近邻算法 学习目标 1.1 K-近邻算法简介 学习目标 1 什么是K-近邻算法 1 ...
- java实现apriori算法_七大经典、常用排序算法的原理、Java 实现以及算法分析
0. 前言 大家好,我是多选参数的程序员,一个正再 neng 操作系统.学数据结构和算法以及 Java 的硬核菜鸡.数据结构和算法是我准备新开的坑,主要是因为自己再这块确实很弱,需要大补(残废了一般) ...
- 《Python Spark 2.0 Hadoop机器学习与大数据实战_林大贵(著)》pdf
<Python+Spark 2.0+Hadoop机器学习与大数据实战> 五星好评+强烈推荐的一本书,虽然内容可能没有很深入,但作者非常用心的把每一步操作详细的列出来并给出说明,让我们跟着做 ...
- 工业制造中的大数据分析应用_工业大数据分析方案-美林数据
认识工业大数据 什么是工业大数据? 我们先看看维基百科的说法:"工业大数据(Industrialbig data)是构成工业人工智能的重要元素,指由工业设备高速产生的大量数据,对应不同时间下 ...
- weka java 分类算法_使用Weka快速实践机器学习算法
[译者注]在当下人工智能火爆发展的局面,每时每刻都有新的技术在诞生,但如果你是一个新手,Weka或许能帮助你直观.快速的感受机器学习带来的解决问题的新思路. Weka使机器学习的应用变得简单.高效并且 ...
- 观大数据有感_观大数据审计有感
观大数据审计有感 拥抱大数据审计 从我做起 在审计系统集中整训的第四天, 我们聆听学习了一部分先进单位 关于大数据审计应用的经验交流, 审计是专业性很强的工作, 并且紧 跟时代不断更新,闭门造车不可取 ...
- Java幸运盒子代码_幸运盒子扭蛋机小程序app开发
互联网产品是植根于互联网大环境的产品,幸运盒子扭蛋机小程序app开发是互联网产品的基本生长土壤.互联网的思想.原则和方法,必然以类似于"基因"继承的形式在每一个具体互联网产品中得以 ...
- 沃舍尔算法_[数据结构拾遗]图的最短路径算法
前言 本专题旨在快速了解常见的数据结构和算法. 在需要使用到相应算法时,能够帮助你回忆出常用的实现方案并且知晓其优缺点和适用环境.并不涉及十分具体的实现细节描述. 图的最短路径算法 最短路径问题是图论 ...
- 错误录入 算法_如何使用验证错误率确定算法输出之间的关系
错误录入 算法 Monument (www.monument.ai) enables you to quickly apply algorithms to data in a no-code inte ...
- 路径规划算法_自动驾驶汽车路径规划算法浅析
自动驾驶汽车的路径规划算法最早源于机器人的路径规划研究,但是就工况而言却比机器人的路径规划复杂得多,自动驾驶车辆需要考虑车速.道路的附着情况.车辆最小转弯半径.外界天气环境等因素. 本文将为大家介绍四 ...
最新文章
- devops和docker_通过免费的2小时Docker课程学习DevOps基础知识
- SB Admin 2 学习笔记1
- png图片IDAT块异常
- angularjs解决方案之 递归模板
- 将您重定向的次数过多什么意思_电池循环次数是什么意思?怎么计算的?
- HTTP状态码对照表(全部状态_建议收藏)
- 《3》CentOS7.0+OpenStack+kvm云平台部署—配置Glance
- java 并发_Java并发防范机制
- MapReduce运行流程分析
- html游戏抓包,常用的网页抓包工具
- Spring定时器corn表达式
- 理解分布函数(概率论)
- Classic Shell:找回 Windows 8 / Windows Server 2012 的经典的开始按钮和开始菜单
- ftp 服务器管理工具,5款最好用的ftp 服务器管理工具
- 影响未来的十大网络技术
- hifiasm对HiFi PacBio进行组装
- 『中级篇』什么是Container(15)
- 定时开关机-Android4.4/6.0
- 图形学(8)二维三维图形变换
- 自动化签到的三种方式
热门文章
- 和游戏服务器的连接中断错误 1,绝地求生“与Steam服务器连接时出现了一个问题”怎么解决...
- win10卸载软件程序
- Entity Alignment between Knowledge Graphs Using Attribute Embeddings
- 编译原理LL(1)文法-判断,first,follow,select,分析字符串
- boost::asio 学习
- 一文看懂GPIO口的八种工作原理
- 群晖Docker容器“failed to initialize logging driver“解决办法
- 群晖docker搭建halo个人博客
- 与dalao学校的联shou考wan(11.2)(dp+乱搞+树形dp+期望)
- 《静态时序分析实用方法》第三章翻译