JAVA实现的基于权重的抽奖算法
/**
* 抽奖
*
* @param originalRates 原始的概率列表,保证顺序和实际物品对应
* @return 抽到的奖品索引
*/
public static int lottery(List<Double> originalRates) {
if (originalRates == null || originalRates.isEmpty()) {
throw new IllegalArgumentException("originalRates is not a legal Argument");
}
// 计算总概率
double sumRate = 0d;
for (double rate : originalRates) {
sumRate += rate;
}
// 计算概率分布
double nextDouble = Math.random() * sumRate;
double tempSumRate = 0d;
int i;
for (i = 0; i < originalRates.size(); i++) {
tempSumRate += originalRates.get(i);
if (nextDouble <= tempSumRate) {
break;
}
}
return i;
}
测试100w次结果
如何使用