近期碰到的一个需求,实现一个类似大转盘抽奖的功能,需自定义奖项,各奖项中奖概率,当日抽奖最大次数,抽奖成本等。分享一个简单的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. 摄影获得最佳图像的十大要诀_十大最佳应用程序性能管理工具

    摄影获得最佳图像的十大要诀 Looking for Application Performance Management (APM) tools for your organization? Here ...

  2. 为什么不用python做大数据_光环大数据告诉你为什么说:人生苦短,我用Python

    首先我们要说明的是本文不扯什么大道理,只是先介绍Python的背景,然后从实用的角度出发举一两个真实栗子. 首先要想了解要一门语言的好坏,或者为什么招程序员喜欢(卧槽,原来程序员喜欢不是女朋友?)我们 ...

  3. python幸运数字判断_幸运数字 小程序

    问题描述:1-N个数字,每个数字的范围-9999到9999,把这N个数字排序后,删除奇数位的数,然后把剩余的数按原位置排序后继续删除奇数位,直到剩余一个数为止,剩余的数就是幸运数,输出幸运数和它最初的 ...

  4. python制作数据化大屏_可视化大屏经验分享

    最近在实际项目中积累了一些经验,以及看到很多大神们的分享,不断学习和丰富关于大屏设计的特点及数据可视化的表达方式.以下经验来自于多处资源,希望对有这方面需求的同学有所帮助. 大屏显示的一些特点: 1. ...

  5. java常见性能优化_十大最常见的Java性能问题

    java常见性能优化 Java性能是所有Java应用程序开发人员都关心的问题,因为快速使应用程序与使其正常运行同等重要. 史蒂文·海恩斯(Steven Haines)使用他在Java性能问题上的个人经 ...

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

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

  7. java小鸡大冒险_小鸡大冒险怎么玩 新手攻略

    小鸡大冒险是一款以小鸡为主视角展开的益智闯关游戏,那这款轻松可爱的游戏怎么玩呢?怎么样才算闯关成功呢?今天小编就带大家初步了解下这款游戏怎么玩! 进入游戏菜单后,点击一个关卡,就会出现如下的界面,描述 ...

  8. java小魔女大冒险_小魔女大冒险,小魔女大冒险下载,小魔女大冒险官网,礼包,活动,图片,评测,专区,论坛 - 酷酷跑手机游戏...

    在这款游戏中,我们将化身为一名小魔女,用自己的魔法来拯救那些被困的小动物,下面我们先来看下游戏的操作. 点击想要让小魔女到达的地方,小魔女就会走到那个位置,当走到台阶前面时,随便点击屏幕上任意位置,小 ...

  9. java小鸡大冒险_小鸡大冒险

    游戏介绍 一款独特的横版冒险的小鸡游戏,游戏中玩家要控制一个小鸡在一个充满危险的小房间里,面对各种关卡前行,周围会不断的出现阻扰你前面的各种武器道具,小心谨慎的过关前提下,不燃你可能就血腥当场了,多趣 ...

  10. java勇者大冒险_勇者大冒险 第一集 开车时英文歌 什么名

    满意答案 zpjpXzd3 2016.01.01 采纳率:53%    等级:8 已帮助:361人 Lucky me lucky you A victory for your chosen Danci ...

最新文章

  1. 5页面返回上个页面定位_5个步骤,画好页面流程图
  2. 百度离职员工吐槽:整天除了工作还要演好戏,拍马屁,心太累!
  3. 安卓高手之路之java层Binder
  4. B-JUI(Best jQuery UI) 前端框架
  5. Matlab 常用运算符的用法和功能
  6. linux-基本权限UGO-读写执行权限
  7. 几种SQL取日期部分的方法
  8. 求cluster的质心坐标
  9. 曲线组合图 类型详情
  10. 信息处理工具计算机.ppt,第二课_计算机信息处理工具讲述.ppt
  11. chrome升级后无高级-断续访问
  12. 漫城cms免费漫画+小说cms系统
  13. 几个免费的英文文献的网站
  14. 显示器带宽测试软件,三种常见的上行带宽测试方法
  15. matlab自由落体程序,基于MATLAB的自由落体运动仿真.pdf
  16. 零基础入门语音识别-食物声音识别
  17. mysql报错:check the manual that corresponds to your MySQL server version for the right syntax to use
  18. HSV颜色空间和RGB颜色空间相互转换C语言实现
  19. go语言泛型在IDE中语法报错
  20. Linux进程中Dec04什么意思,Linux下缩小可执行程序 (一) 非使用符号的去除

热门文章

  1. vmware虚拟机安装win11系统教程
  2. 图形美不胜收,25 个可视化案例,Matplotlib 始终都是数据可视化绕不开的 Python 库
  3. IT程序员常去的论坛、社区、网站有哪些?
  4. linux 快速查找文件
  5. 计算机怎么快速匹配,四种方法教您如何在Excel中快速查找重复数据
  6. 15个国外最佳免费图片素材网站,快让小伙伴都知道
  7. Mysql如何跨库查询数据?
  8. nssa和stub_华为stub、nssa区域配置
  9. centos查看内存使用最多_CentOs中查看内存插槽数、最大容量和频率 查看内存插槽数、最大容量和频率...
  10. 【机器学习】分类决策树基本介绍+代码实现