- 具体概率算法-区间算法
该抽奖方法比较简陋 可以根据业务添加权重或者其他扩展。
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;
}