双蛋节(圣诞+元旦)刚刚过去,前几天项目上线的砸金蛋活动也圆满结束。

   

  现在在许多网站上都会有抽奖的活动,抽奖的算法也是多种多样,这里介绍一下如何根据每种奖品的权重来抽奖,适用于多种抽奖形式。

奖品设置

  比如现在举行一次砸金蛋活动中,奖品如下:

    
   
  奖品够丰富的哇,香车美女豪宅都有了~不过由于法律的原因,活人是不能赠送的,所以一等奖只能送海报了~~

  奖品在数据库中的存储情况

   

抽奖实现

  奖品实体 Prize.java

public class Prize {    
    private int id;//奖品id
    private String prize_name;//奖品名称
    private int prize_amount;//奖品(剩余)数量
    private int prize_weight;//奖品权重
    //getter、setter
1
2
3
4
5
6

  这里只考虑最简单的抽奖实现,所以暂时只为奖品设计如上4个字段。

  见注释,prize_name表示奖品名称;prize_amount表示奖品数量,即本次抽奖活动计划发放此奖品的数量;prize_weight表示奖品权重,表示奖品被抽到的几率的比重,权重越大,被抽到的几率越大,比如本次砸金蛋活动有4种奖品,权重分别是1、2、3、4,总权重是10,那么每种奖品被抽到的几率就是1/10,2/10,3/10,4/10。

  核心算法:

/**
     * 根据Math.random()产生一个double型的随机数,判断每个奖品出现的概率
     * @param prizes
     * @return random:奖品列表prizes中的序列(prizes中的第random个就是抽中的奖品)
     */
    public int getPrizeIndex(List<Prize> prizes) {
        DecimalFormat df = new DecimalFormat("######0.00");  
        int random = -1;
        try{
            //计算总权重
            double sumWeight = 0;
            for(Prize p : prizes){
                sumWeight += p.getPrize_weight();
            }

//产生随机数
            double randomNumber;
            randomNumber = Math.random();

//根据随机数在所有奖品分布的区域并确定所抽奖品
            double d1 = 0;
            double d2 = 0;          
            for(int i=0;i<prizes.size();i++){
                d2 += Double.parseDouble(String.valueOf(prizes.get(i).getPrize_weight()))/sumWeight;
                if(i==0){
                    d1 = 0;
                }else{
                    d1 +=Double.parseDouble(String.valueOf(prizes.get(i-1).getPrize_weight()))/sumWeight;
                }
                if(randomNumber >= d1 && randomNumber <= d2){
                    random = i;
                    break;
                }
            }
        }catch(Exception e){
            System.out.println("生成抽奖随机数出错,出错原因:" +e.getMessage());
        }
        return random;
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39

  抽奖的逻辑可以用下面这张图表示:

   

  分析:如上图,为了便于计算和理解,设置每种奖品的权重分别为1,2,3,4,所以被抽到的概率分别为0.1,0.2,0.3,0.4(本次活动中奖概率为100%)。

  先生成一个随机数randomNumber,然后根据随机数所处区域判断奖品:

0<randomNumber<=0.1   表示抽中一等奖
0.1<randomNumber<=0.3 表示抽中二等奖
0.3<randomNumber<=0.6 表示抽中三等奖
0.6<randomNumber<=1.0 表示抽中四等奖
1
2
3
4

抽奖测试

public static void main(String[] agrs) {
        int i = 0;
        PrizeMathRandom a = new PrizeMathRandom();
        int[] result=new int[4];
        List<Prize> prizes = new ArrayList<Prize>();

Prize p1 = new Prize();
        p1.setPrize_name("范冰冰海报");
        p1.setPrize_weight(1);//奖品的权重设置成1
        prizes.add(p1);

Prize p2 = new Prize();
        p2.setPrize_name("上海紫园1号别墅");
        p2.setPrize_weight(2);//奖品的权重设置成2
        prizes.add(p2);

Prize p3 = new Prize();
        p3.setPrize_name("奥迪a9");
        p3.setPrize_weight(3);//奖品的权重设置成3
        prizes.add(p3);

Prize p4 = new Prize();
        p4.setPrize_name("双色球彩票");
        p4.setPrize_weight(4);//奖品的权重设置成4
        prizes.add(p4);

System.out.println("抽奖开始");
        for (i = 0; i < 10000; i++)// 打印100个测试概率的准确性
        {
            int selected=a.getPrizeIndex(prizes);
            System.out.println("第"+i+"次抽中的奖品为:"+prizes.get(selected).getPrize_name());
            result[selected]++;
            System.out.println("--------------------------------");
        }
        System.out.println("抽奖结束");
        System.out.println("每种奖品抽到的数量为:");
        System.out.println("一等奖:"+result[0]);
        System.out.println("二等奖:"+result[1]);
        System.out.println("三等奖:"+result[2]);
        System.out.println("四等奖:"+result[3]);       
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
  尝试抽奖10000次的结果如下:

一等奖:962
二等奖:2007
三等奖:3043
四等奖:3988
1
2
3
4
  每类奖品获奖次数比例刚好大约为1:2:3:4,学过概率的你肯定知道抽奖次数越多,测试结果越准确~~

  Tips:

  如果计划中奖率是100%的话,那么10个奖品只能抽奖10次,所以还要根据实际情况设置每种奖品数量和权重。

  如果需要设置中奖率不为100%,可以添加一个“伪奖品”,并为其设置权重,那么抽到这个“伪奖品”的概率就是不中奖的概率。

  如果在抽奖过程中某类奖品抽完了,可以做个判断,如果此奖品的剩余数量为0,则重新抽取奖品,直到抽到其他奖品位置。

  本来活动期间小编报着随时抢救bug的心态,连回家都抱着电脑,然而从活动上线到活动结束,并没有出现bug~~在此感谢产品部、测试部和研发部所有同事在上线前轰炸式的测试~~

   

【 转载请注明出处——胡玉洋《【项目实战】——Java中根据奖品权重实现抽奖(砸金蛋、大转盘等)》】
————————————————
版权声明:本文为CSDN博主「dannyhoo6688」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/huyuyang6688/article/details/50480687

【项目实战】——Java根据奖品权重计算中奖概率实现抽奖(适用于砸金蛋、大转盘等抽奖活动)相关推荐

  1. 【项目实战】——Java根据奖品权重计算中奖概率实现抽奖(适用于砸金蛋、大转盘等抽奖活动)...

    Java根据奖品权重计算中奖概率实现抽奖http://www.bieryun.com/1035.html 双蛋节(圣诞+元旦)刚刚过去,前几天项目上线的砸金蛋活动也圆满结束. 现在在许多网站上都会有抽 ...

  2. Java根据奖品权重计算中奖概率实现抽奖(适用于砸金蛋、大转盘等抽奖活动)

    ---------------------  作者:dannyhoo6688  来源:CSDN  原文:https://blog.csdn.net/huyuyang6688/article/detai ...

  3. java中奖率算法_JS简单实现:根据奖品权重计算中奖概率实现抽奖的方法

    本文主要介绍:使用 JS 根据奖品权重计算中奖概率实现抽奖的方法. 一.示例场景 1.1.设置抽奖活动的奖项名称 奖项名称:["一等奖", "二等奖", &qu ...

  4. JS简单实现:根据奖品权重计算中奖概率实现抽奖的方法

    本文主要介绍:使用 JS 根据奖品权重计算中奖概率实现抽奖的方法. 一.示例场景 纯爱小说 www.shupu.org 1.1.设置抽奖活动的奖项名称 奖项名称:["一等奖", & ...

  5. html抽奖调整中奖率,JS简单实现:根据奖品权重计算中奖概率实现抽奖的方法 _ 惠州SEO...

    摘要 //layui模块化引用layui.use(['jquery','util'],function(){var$=layui.$,util=layui.util;//设置奖项名称.权重.中奖次数等 ...

  6. 视频教程-Springboot+Vue前后的分离整合项目实战-Java

    Springboot+Vue前后的分离整合项目实战 10多年互联网一线实战经验,现就职于大型知名互联网企业,架构师, 有丰富实战经验和企业面试经验:曾就职于某上市培训机构数年,独特的培训思路,培训体系 ...

  7. 视频教程-Vue、Spring Boot开发小而完整的Web前后端分离项目实战-Java

    Vue.Spring Boot开发小而完整的Web前后端分离项目实战 3年多.net开发经验:5年的java后端开发经验,熟悉行.net,java流行技术,拥有多个.net,java web企业级应; ...

  8. 视频教程-SpringBoot2+Vue+AntV前后端分离开发项目实战-Java

    SpringBoot2+Vue+AntV前后端分离开发项目实战 10多年互联网一线实战经验,现就职于大型知名互联网企业,架构师, 有丰富实战经验和企业面试经验:曾就职于某上市培训机构数年,独特的培训思 ...

  9. 项目实战 Java读取Excel数据

    项目实战 Java读取Excel数据 前言 实现步骤 导入POI依赖 示例Excel表结构 编写读取Excel工具类 实现思路 读取Excel数据工具类实现代码 取出从excel中获取的数据,并插入到 ...

最新文章

  1. Electron Cash发布功能机BCH钱包,低端市场利好来袭
  2. 撕掉伪善——用人话解释马云的996两次发言
  3. ubuntu sun-java6-jre_在 Ubuntu Lucid 下请回 Sun Java6 Jre, 赶走 OpenJDK
  4. 使用反射获得jar包中的类、方法、参数、返回值类型,然后动态加载jar包运行方法
  5. pytorch 与numpy 部分操作的对应关系
  6. 解决sketch文件导出没有背景色的问题
  7. 机器学习实战0基础入门(一)之简单入门
  8. uniapp 微信小程序的弹框文字换行
  9. 常见分布式任务调度工具分析
  10. 企业招聘采集算法(58,51job,海南在线,智联招聘,百度招聘,猎聘网)
  11. Unity不规则按钮点击区域(UGUI)
  12. 两道类似的概率期望题目
  13. A. 贝壳找房性价比
  14. xsell5 momokai配色
  15. STATA闪退,CLDS数据无法转码
  16. Tomcat中设计模式
  17. Unreal Engin_画廊制作笔记 _012修改World Settings设置
  18. auto install pkgs
  19. 理解:simulation、emulation、模拟、仿真
  20. Spring data JPA使用详解(超详细)

热门文章

  1. 红帽权限设置及提权知识点结合
  2. 发AI-Native新品,升级中台能力:看百度智能云的全力进化
  3. pandas python2_python pandas二维数据分析
  4. 老虎和真成投资发起的SPAC获批合并:新公司SAI估值1.88亿美元
  5. 北信源移动存储介质使用管理系统 软件
  6. js 字符串转成数组对象
  7. 百练2786 Pell数列--简单DP(递推)
  8. matlab假设检验摘要,MATLAB数据统计和分析:参数估计和假设检验
  9. 『昆明SEO』网站被降权的常见问题有些呢?
  10. 使用selenium爬取小说以及一些注意事项和坑