记一次抽奖概率算法

1,464 阅读1分钟
  • 具体概率算法-区间算法

该抽奖方法比较简陋 可以根据业务添加权重或者其他扩展。

 public static PrizeModel lotteryPrize(List<PrizeModel> awards) {
        //总的概率区间
        float totalPro = 0f;
        //存储每个奖品新的概率区间
        List<Float> proSection = new ArrayList<>();
        proSection.add(0f);
        //遍历每个奖品,设置概率区间,总的概率区间为每个概率区间的总和
        for (PrizeModel award : awards) {
            //每个概率区间为奖品概率乘以1000000(把小数转换为整)再乘以剩余奖品数量
            totalPro += award.getWinRate().floatValue() * award.getCount();
            proSection.add(totalPro);
        }
        //如果概率太小直接返回
        if (totalPro < 1) {
            return null;
        }
        //获取总的概率区间中的随机数
        Random random = new Random();
        float randomPro = (float) random.nextInt((int) totalPro);
        //判断取到的随机数在哪个奖品的概率区间中
        for (int i = 0, size = proSection.size(); i < size; i++) {
            if (randomPro >= proSection.get(i)
                    && randomPro < proSection.get(i + 1)) {
                return awards.get(i);
            }
        }
        return null;
    }
  • model类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class PrizeModel {

    private BigDecimal winRate;
    private Integer id;
    private Integer count;
}