如何使用Java实现指定概率的抽奖
public static Prize lottery(List
//按照权重从小到大排序奖品
prizeList.sort(Comparator.comparingInt(Prize::getWeight));
//计算节点 节点的数量比奖品的数量多一个,即0
List
//第一个节点为0
nodeList.add(0);
for (Prize prize : prizeList) {
//每一个节点等于前一个节点+当前奖品的权重
nodeList.add(nodeList.get(nodeList.size() - 1) + prize.getWeight());
}
//生成 0-结束节点 的随机数
int randomInt = RandomUtil.randomInt(0, nodeList.get(nodeList.size() - 1));
//最终抽奖逻辑 此处需要从第二个节点开始遍历
for (int i = 1; i < nodeList.size(); i++) {
//本次节点
Integer endNode = nodeList.get(i);
//前一个节点
Integer startNode = nodeList.get(i - 1);
//若随机数大于等于前一个节点并且小于本节点,在prizeList中位于i-1位置的奖品为抽中奖品
//Tip:比较大小时,左闭右开与左开右闭都可以,不影响整体概率
if (randomInt >= startNode
&& randomInt < endNode) {
return prizeList.get(i - 1);
}
}
throw new RuntimeException("程序异常 生成的随机数不在任何奖品区间内");
}