/**
* 抽奖算法
*/
public Prize ownPrize(List<Prize> prizes) {
// Number of prizes
int length = prizes.size();
// Every prize has the same rate?
boolean sameRate = true;
// the rate of every prize
int[] rates = new int[length];
// the first invoker's weight
int firstRate = prizes.get(0).getPrizeLottery();
rates[0] = firstRate;
// The sum of rate
int totalWeight = firstRate;
for (int i = 1; i < length; i++) {
int rate = prizes.get(i).getPrizeLottery();
// save for later use
rates[i] = rate;
// Sum
totalWeight += rate;
if (sameRate && rate != firstRate) {
sameRate = false;
}
}
if (totalWeight > 0 && !sameRate) {
// If (not every prize item has the same rate & at least one prize item's rate>0),
// select randomly based on totalRate.
int offset = ThreadLocalRandom.current().nextInt(totalWeight);
// Return a prize item based on the random value.
for (int i = 0; i < length; i++) {
offset -= rates[i];
if (offset < 0) {
return prizes.get(i);
}
}
}
// If all prize items have the same rate value or totalRate=0, return evenly.
return prizes.get(ThreadLocalRandom.current().nextInt(length));
}
抽奖计算法
最新推荐文章于 2024-04-26 12:14:11 发布