1. 抽奖需求
根据配置奖品的概率去抽取奖品,其中总概率不一定是 1 ,此时是按照权重去抽取奖品的。
2. 实现
2.1 思路:区间
区间 | [0, 10):奖品1 | [10, 65):谢谢参与 | [65, 98):奖品2 | [98, 100):奖品3 |
---|---|---|---|---|
概率 | 奖品1概率:10 | 谢谢参与概率:55 | 奖品2概率:33 | 奖品3概率:2 |
- 根据奖品概率构造一个区间
- 通过随机数Rondom的API获取随机值 [0, 最大值)
- 根据随机值匹配到对应区间的奖品,即是抽取到的奖品
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 ||