抽奖方法使用说明
** 参数列表**
goodsList 抽奖奖品列表
goodsRateList 奖品中奖概率列表(概率与奖品列表 保持一致,不能存在为0的数据)
抽奖工具类源码
package com.uxun.util;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* 奖品抽奖工具类,返回抽中的奖品对象
*
* 参数:
* goodsList:抽奖奖品列表;
* goodsRateList:抽奖奖品中奖概率列表;
*
* 备注:
* 1.抽奖奖品列表(goodsList)和 抽奖奖品中奖概率列表(goodsRateList)不能为空,长度必须一致,且中奖概率是一一对应的,
* 否则不满足该工具的使用初衷
* 2.不能存在中奖概率为 0 的奖品
*
* @param <T>
*/
public class LotteryDrawUitl<T> {
/**
* 抽奖方法
*
* @param goodsList 奖品列表;
* @param goodsRateList 奖品中奖概率列表(概率与奖品列表保持一致,不能存在为0的数据)
*
* @return 抽中的奖品
*/
public static <T> T lotteryDraw(List<T> goodsList, List<Double> goodsRateList) {
if (goodsList == null || goodsList.isEmpty()) {
System.out.println("****************抽奖奖品列表为空,不满足抽奖条件,抽奖奖品返回null对象****************");
return null;
}
if (goodsRateList == null || goodsRateList.isEmpty()) {
System.out.println("****************抽奖奖品中奖概率列表为空,不满足抽奖条件,抽奖奖品返回null对象****************");
return null;
}
if(goodsList.size() != goodsRateList.size()){
System.out.println("****************抽奖奖品列表和奖品中奖概率列表长度不一致,不满足抽奖条件,抽奖奖品返回null对象****************");
return null;
}
int size = goodsRateList.size();
// 1.计算总概率,这样可以保证不一定总概率是1
double sumRate = 0d;
for (double rate : goodsRateList) {
if(rate <= 0){
System.out.println("****************抽奖奖品中奖概率列表存在中奖概率为0的对象,不满足抽奖条件,抽奖奖品返回null对象****************");
// 需要排除中奖概率为0的数据,否则全部不中奖
return null;
}
sumRate += rate;
}
// 2.计算每个物品在总概率的基础下的概率情况
List<Double> sortOrignalRates = new ArrayList<Double>(size);
Double tempSumRate = 0d;
for (double rate : goodsRateList) {
tempSumRate += rate;
sortOrignalRates.add(sumRate == 0 ? 0 : tempSumRate / sumRate);
}
// 3.根据区块值来获取抽取到的物品索引
double nextDouble = Math.random();
sortOrignalRates.add(nextDouble);
Collections.sort(sortOrignalRates);
return goodsList.get(sortOrignalRates.indexOf(nextDouble));
}
}