一、概率抽奖逻辑梳理流程图
二、相关代码
通过奖品集合获取对应的奖品概率集合
这里主要是对奖品集合进行解析,得出对应奖品的概率集合,供下面的概率抽奖来使用。
/**
* 概率抽奖
* @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;
}