如何使用Java实现指定概率的抽奖

  public static Prize lottery(List prizeList) {

  //按照权重从小到大排序奖品

  prizeList.sort(Comparator.comparingInt(Prize::getWeight));

  //计算节点 节点的数量比奖品的数量多一个,即0

  List nodeList = new ArrayList<>();

  //第一个节点为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("程序异常 生成的随机数不在任何奖品区间内");

  }