抽奖模块-概率抽奖

一、概率抽奖逻辑梳理流程图

二、相关代码
通过奖品集合获取对应的奖品概率集合

这里主要是对奖品集合进行解析,得出对应奖品的概率集合,供下面的概率抽奖来使用。

/**
* 概率抽奖
* @param awardList
* @param probability
* @return
*/
public static int drawLottery(List<SelfHallLotteryAward> awardList, double probability){
   //奖品概率集合
   logger.info("抽奖接口drawLottery 开始概率抽奖");
   List<Double> orignalRates = new ArrayList<Double>(awardList.size());
   for (SelfHallLotteryAward award : awardList) {
       //奖品概率
       double awardProbability = award.getAwardProbability();
       if (awardProbability < 0) {
           awardProbability = 0;
       }
       //奖品概率集合
       orignalRates.add(awardProbability);
   }
​
   int orignalIndex=0;
   //抽奖方法---得到奖项索引
   orignalIndex = LotteryUtil.lottery(orignalRates,probability);
   return orignalIndex;
}

概率抽奖获取奖品索引
这里面的关键是在遍历奖品概率集合,对每个物品计算出在总概率的基础下的概率情况,然后进行区块概率累加的方式来获取奖品利率比,将利率比封装成一个集合,接着将随机种子丢到集合里,观察种子在集合中的下标对应到奖品列表的下标,获取奖品的概率索引并返回,最终得以实现概率抽奖。

public static int lottery(List<Double> ratesList, double sumRate) {

   if (ratesList == null || ratesList.isEmpty()) {

       return -1;

   }

   int size = ratesList.size();

​

   // 计算每个物品在总概率的基础下的概率情况

   List<Double> sortOrignalRates = new ArrayList<Double>(size);

   Double tempSumRate = 0d;

   for (double rate : ratesList) {

       tempSumRate += rate;

       sortOrignalRates.add(tempSumRate * sumRate);

   }

   logger.info("抽奖工具类 lottery 利率比>>>>>>::" + sortOrignalRates);

   // 根据区块值来获取抽取到的物品索引

   double nextDouble = Math.random();

​

   logger.info("抽奖工具类 lottery 随机数::" + nextDouble);

   sortOrignalRates.add(nextDouble);

   Collections.sort(sortOrignalRates);

   logger.info("抽奖工具类 lottery 利率比   反转#####::" + sortOrignalRates);

   int numA=sortOrignalRates.indexOf(nextDouble);

   if(numA == 0){

       return numA;

   }

   return numA;

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值