转盘抽奖
项目背景
在婚庆行业,当主持人和现场来宾互动的时候,有时候需要进行抽奖来进行现场和观众之间的互动性,让用户更好的参与这场婚宴,有更加活跃的活动,所以需要设计一个抽奖转盘。
抽奖逻辑
- 奖项数量可以自定义
- 可以设置每个奖项的中将概率
- 设置每个奖项的数量,库存用完之后该奖项不能被抽取
抽奖思路
设置一个默认指标x=100,然后对奖项进行循环遍历,在遍历每一个元素的时候,查询出他的概率和数量,先判断这个数量是否大于0,如果该数量不大于0,那么直接将x减去当前奖项的概率,然后continue继续循环,如果数量大于0,然后在[0,x]之间生成一个随机数,让他去和当前遍历的这个奖项的概率去比较,如果小于当前奖项,则刚好概率在这个奖项的区间,表示抽中了这个奖,直接返回该奖项即可。如果大于等于该奖项的概率,那么X减去当前奖项的概率,continue继续循环。有概率会发生这个循环不会出现抽中的情况,其实还有库存但是没有抽中,是因为库存和随机数之间冲突导致,那我们在循环完成之后,如果没抽中,则我们查兰有没有剩余库存,有的话随机哪一个补上去即可。
代码样例
private Map<String,Object> drawAward(List<Map<String, Object>> list){//list是所有奖项的集合
int maxRandom = 100;
for(Map<String,Object> item : list){
int num = (int) item.get("num");//奖项数量
int chance = (int) item.get("chance");//奖项概率
int random = RandomUtil.randomInt(0, maxRandom);//生成随机数,最大值是预定的指标
if(num>0){
if(random<chance){
return item;
}else{
maxRandom -= chance;
continue;
}
}else{
maxRandom -= chance;
continue;
}
}
//有可能出现特殊情况,导致所有循环结束,有奖项还有库存但没抽中,我们从有库存的商品中随机抽一个返回
for(Map<String,Object> item : list){
int num = (int) item.get("num");//奖项数量
int chance = (int) item.get("chance");//奖项概率
if(num>0&&chance>0){
return item;
}
}
return null;
}