实现权重抽奖算法(java)

实现权重抽奖算法(java)

1. 算法思想

  1. 为了完成随机抽取一个奖品的目的,我们需要在奖品对应的实体中有相应的权重字段,用来区别限制某种奖品对应的被抽中的概率。
  2. 首先要遍历全部奖品,将权重进行加合。要始终保证奖品列表的索引不发生变化,这样确定了抽中的奖品能够正确对应。
  3. 产生一个Double型的随机数。这个随机数是最后抽奖得到的奖品索引。
  4. 计算每个奖项对应的概率区间,以1为例,若一等奖的权重为10%,那么我们得到的区间为0
  5. 以此类推,索引随机数myRandom对应的值随机生成的左右区间为[前一个奖品获奖概率,后一个奖品的获奖概率]。

2. 算法实现

   public int randomPrize(List<PrizeVo> prizes) {
     
        DecimalFormat df = new DecimalFormat("######0.00");
        int random = -1;
        try {
     
            //计算权重和
            double sum = 0;
            for (PrizeVo p : prizes) {
     
                sum += p.getPrizeWeight();
            }

            //产生索引随机数
            double myRandom;
            myRandom = Math.random();

            //根据随机数在所有奖品分布的区域并确定所抽奖品
            double pro1 = 0;
            double pro2 = 0;
            for (int i = 0; i < prizes.size(); i++) {
     
                pro2 += Double.parseDouble(String.valueOf(prizes.get(i).getPrizeWeight())) / sumWeight;
                if (i == 0) {
     
                    pro1 = 0;
                } else {
     
                    pro1 += Double.parseDouble(String.valueOf(prizes.get(i - 1).getPrizeWeight())) / sumWeight;
                }
                if (myRandom >= pro1 && myRandom <= pro2) {
     
                    random = i;
                    break;
                }
            }
        } catch (Exception e) {
     
            System.out.println("抽奖出错" + e.getMessage());
        }
        return random;
    }

3. 应用实例

  1. 奖品实体代码

    package tech.niua.admin.vo;
    
    import lombok.Builder;
    import lombok.Data;
    @Data
    public class PrizeVo {
           
    
        private Long id;
    
        private String title;
    
        private String bgImg;
    
        private String rule;
    
        private String prize;
    
        private String prizeImg;
    
        private Integer prizeWeight;
    
        private String code;
    
    
    }
    
  2. Service实现层代码

     @Override
        public PrizeVo LuckRandom(List<PrizeVo> prizeList){
           
            PrizeRandomTest a = new PrizeRandomTest();
            List<PrizeVo> prizes=prizeList;
            int selected=a.randomPrize(prizes);
            return prizes.get(selected);
        }
    

你可能感兴趣的:(项目相关技术点整理,java)