近期碰到的一个需求,实现一个类似大转盘抽奖的功能,需自定义奖项,各奖项中奖概率,当日抽奖最大次数,抽奖成本等。分享一个简单的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 大转盘算法_幸运大转盘抽奖 抽奖算法 程序实现逻辑相关推荐

  1. Python_机器学习_算法_第1章_K-近邻算法

    Python_机器学习_算法_第1章_K-近邻算法 文章目录 Python_机器学习_算法_第1章_K-近邻算法 K-近邻算法 学习目标 1.1 K-近邻算法简介 学习目标 1 什么是K-近邻算法 1 ...

  2. java实现apriori算法_七大经典、常用排序算法的原理、Java 实现以及算法分析

    0. 前言 大家好,我是多选参数的程序员,一个正再 neng 操作系统.学数据结构和算法以及 Java 的硬核菜鸡.数据结构和算法是我准备新开的坑,主要是因为自己再这块确实很弱,需要大补(残废了一般) ...

  3. 《Python Spark 2.0 Hadoop机器学习与大数据实战_林大贵(著)》pdf

    <Python+Spark 2.0+Hadoop机器学习与大数据实战> 五星好评+强烈推荐的一本书,虽然内容可能没有很深入,但作者非常用心的把每一步操作详细的列出来并给出说明,让我们跟着做 ...

  4. 工业制造中的大数据分析应用_工业大数据分析方案-美林数据

    认识工业大数据 什么是工业大数据? 我们先看看维基百科的说法:"工业大数据(Industrialbig data)是构成工业人工智能的重要元素,指由工业设备高速产生的大量数据,对应不同时间下 ...

  5. weka java 分类算法_使用Weka快速实践机器学习算法

    [译者注]在当下人工智能火爆发展的局面,每时每刻都有新的技术在诞生,但如果你是一个新手,Weka或许能帮助你直观.快速的感受机器学习带来的解决问题的新思路. Weka使机器学习的应用变得简单.高效并且 ...

  6. 观大数据有感_观大数据审计有感

    观大数据审计有感 拥抱大数据审计 从我做起 在审计系统集中整训的第四天, 我们聆听学习了一部分先进单位 关于大数据审计应用的经验交流, 审计是专业性很强的工作, 并且紧 跟时代不断更新,闭门造车不可取 ...

  7. Java幸运盒子代码_幸运盒子扭蛋机小程序app开发

    互联网产品是植根于互联网大环境的产品,幸运盒子扭蛋机小程序app开发是互联网产品的基本生长土壤.互联网的思想.原则和方法,必然以类似于"基因"继承的形式在每一个具体互联网产品中得以 ...

  8. 沃舍尔算法_[数据结构拾遗]图的最短路径算法

    前言 本专题旨在快速了解常见的数据结构和算法. 在需要使用到相应算法时,能够帮助你回忆出常用的实现方案并且知晓其优缺点和适用环境.并不涉及十分具体的实现细节描述. 图的最短路径算法 最短路径问题是图论 ...

  9. 错误录入 算法_如何使用验证错误率确定算法输出之间的关系

    错误录入 算法 Monument (www.monument.ai) enables you to quickly apply algorithms to data in a no-code inte ...

  10. 路径规划算法_自动驾驶汽车路径规划算法浅析

    自动驾驶汽车的路径规划算法最早源于机器人的路径规划研究,但是就工况而言却比机器人的路径规划复杂得多,自动驾驶车辆需要考虑车速.道路的附着情况.车辆最小转弯半径.外界天气环境等因素. 本文将为大家介绍四 ...

最新文章

  1. devops和docker_通过免费的2小时Docker课程学习DevOps基础知识
  2. SB Admin 2 学习笔记1
  3. png图片IDAT块异常
  4. angularjs解决方案之 递归模板
  5. 将您重定向的次数过多什么意思_电池循环次数是什么意思?怎么计算的?
  6. HTTP状态码对照表(全部状态_建议收藏)
  7. 《3》CentOS7.0+OpenStack+kvm云平台部署—配置Glance
  8. java 并发_Java并发防范机制
  9. MapReduce运行流程分析
  10. html游戏抓包,常用的网页抓包工具
  11. Spring定时器corn表达式
  12. 理解分布函数(概率论)
  13. Classic Shell:找回 Windows 8 / Windows Server 2012 的经典的开始按钮和开始菜单
  14. ftp 服务器管理工具,5款最好用的ftp 服务器管理工具
  15. 影响未来的十大网络技术
  16. hifiasm对HiFi PacBio进行组装
  17. 『中级篇』什么是Container(15)
  18. 定时开关机-Android4.4/6.0
  19. 图形学(8)二维三维图形变换
  20. 自动化签到的三种方式

热门文章

  1. 和游戏服务器的连接中断错误 1,绝地求生“与Steam服务器连接时出现了一个问题”怎么解决...
  2. win10卸载软件程序
  3. Entity Alignment between Knowledge Graphs Using Attribute Embeddings
  4. 编译原理LL(1)文法-判断,first,follow,select,分析字符串
  5. boost::asio 学习
  6. 一文看懂GPIO口的八种工作原理
  7. 群晖Docker容器“failed to initialize logging driver“解决办法
  8. 群晖docker搭建halo个人博客
  9. 与dalao学校的联shou考wan(11.2)(dp+乱搞+树形dp+期望)
  10. 《静态时序分析实用方法》第三章翻译