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));
}
}
09-11
2376
05-27
10-14
08-29
12-01
251
12-16
3370
05-02
3727
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交