package com.dg;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;
public class LotteryUtil {
public static int lottery(List<Double> orignalRates) {
if (orignalRates == null || orignalRates.isEmpty()) {
return -1;
}
int size = orignalRates.size();
// 计算总概率,这样可以保证不一定总概率是1
double sumRate = 0d;
for (double rate : orignalRates) {
sumRate += rate;
}
// 计算每个物品在总概率的基础下的概率情况
List<Double> sortOrignalRates = new ArrayList<Double>(size);
Double tempSumRate = 0d;
for (double rate : orignalRates) {
tempSumRate += rate;
sortOrignalRates.add(tempSumRate / sumRate);
}
// 根据区块值来获取抽取到的物品索引
double nextDouble = Math.random();
sortOrignalRates.add(nextDouble);
Collections.sort(sortOrignalRates);
int index = sortOrignalRates.indexOf(nextDouble);
return index >= 0 ? index : size - 1;
}
public static boolean lottery(double probability) {
double remainProbability = 1 - probability;
if (remainProbability <= 0) {
return true;
}
if (remainProbability == 1) {
return false;
}
List<Double> originalRates = new ArrayList<>(
Arrays.asList(probability, remainProbability));
int index = lottery(originalRates);
return index == 0;
}
public static <T> T lottery(List<T> sources, Function<T, Double> function) {
if (sources == null || sources.isEmpty()) {
return null;
}
List<Double> rates = sources.stream().map(function)
.collect(Collectors.toList());
return sources.get(lottery(rates));
}
}
抽奖工具类
最新推荐文章于 2023-09-11 10:15:00 发布