概率抽奖算法

转盘抽奖

项目背景

在婚庆行业,当主持人和现场来宾互动的时候,有时候需要进行抽奖来进行现场和观众之间的互动性,让用户更好的参与这场婚宴,有更加活跃的活动,所以需要设计一个抽奖转盘。

抽奖逻辑

  • 奖项数量可以自定义
  • 可以设置每个奖项的中将概率
  • 设置每个奖项的数量,库存用完之后该奖项不能被抽取

抽奖思路

设置一个默认指标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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员Mapy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值