抽奖逻辑实现

本文介绍了根据奖品概率实现抽奖的逻辑,通过构建概率区间并使用随机数选择中奖项。当抽奖成功但发奖失败时,采取兜底处理视为未中奖;即使奖品库存耗尽,仍可能被抽中但不发放。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 抽奖需求

​ 根据配置奖品的概率去抽取奖品,其中总概率不一定是 1 ,此时是按照权重去抽取奖品的。

2. 实现

2.1 思路:区间

区间 [0, 10):奖品1 [10, 65):谢谢参与 [65, 98):奖品2 [98, 100):奖品3
概率 奖品1概率:10 谢谢参与概率:55 奖品2概率:33 奖品3概率:2
  1. 根据奖品概率构造一个区间
  2. 通过随机数Rondom的API获取随机值 [0, 最大值)
  3. 根据随机值匹配到对应区间的奖品,即是抽取到的奖品

2.2 代码

/**
 * 奖品类
 */
@Data
@AllArgsConstructor
public class Award {
   
   

    private Integer id;
    private String name;
    private Integer weight;
}

/**
 * 通用抽奖接口
 * @param <T>
 */
public interface ILotteryService<T> {
   
   

    T draw(List<T> awardList) throws DrawException;
}

/**
 * 区间实现抽奖概率
 */
public class IntervalLotteryService implements ILotteryService<Award>{
   
   

    /**
     * 通过区间来实现概率分配  
     * 奖品1 [0,10)
     * 奖品2 [10,90)
     * 奖品3 [90,100)
     * 奖品4 [100,980)
     * @param awardList
     * @return
     */
    @Override
    public Award draw(List<Award> awardList) throws DrawException {
   
   
        int listSize = awardList.size();
        if (awardList == null ||
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值