美文网首页
抽奖算法

抽奖算法

作者: Ludwigvan | 来源:发表于2018-11-21 14:01 被阅读77次

最近要实现一个抽奖的功能;根据权重来决定奖品;其实就是数学里的概率问题;概率越大被选中的机会就越大;简单实现了一个算法工具类如下:

public class PrizeUtil {

    private static final Logger log =LoggerFactory.getLogger(PrizeUtil.class);

    public static String createReward(List<TbUserGameYybfVo> gameYybfs, TbGameYybf tbGameYybf){
        List<RewardVo> result = new ArrayList<>();
        log.info("----------------游戏金币:"+tbGameYybf.getPoint().doubleValue());
        BigDecimal reward = tbGameYybf.getPoint().multiply(new BigDecimal(0.8));
        log.info("----------------奖池 :"+reward.doubleValue()+"金币");
        BigDecimal devide = new BigDecimal(8);
        BigDecimal oneDevide = new BigDecimal(5);
        BigDecimal twoDevide = new BigDecimal(2);
        BigDecimal threeDevide = new BigDecimal(1);

        int oneReward = reward.divide(devide).multiply(oneDevide).intValue();
        double twoReward = reward.divide(devide).multiply(twoDevide).intValue();
        double threeReward = reward.divide(devide).multiply(threeDevide).intValue();
        log.info("一等奖金币:{};二等奖金币:{};三等奖金币:{}",oneReward,twoReward,threeReward);

        BigDecimal[] bigDecimals = new BigDecimal[]{new BigDecimal(oneReward),new BigDecimal(twoReward),new BigDecimal(threeReward)};
        List<Integer> users =new ArrayList<>();
        for(int i=0;i<3;i++){
            int index = drawGift(gameYybfs);
            Integer userId = gameYybfs.get(index).getUserId();
            if(users.contains(userId) ){
                i--;
            }else{
                users.add(userId);
                RewardVo vo =new RewardVo();
                vo.setName(gameYybfs.get(index).getName());
                vo.setHead(gameYybfs.get(index).getHead());
                vo.setId(userId);
                vo.setPoint(bigDecimals[i]);
                result.add(vo);
            }
        }
        return new Gson().toJson(result);
    }


    public static int drawGift(List<TbUserGameYybfVo> giftList){

        if(null != giftList && giftList.size()>0){
            List<Double> orgProbList = new ArrayList<Double>(giftList.size());
            for(TbUserGameYybf gift:giftList){
                //按顺序将概率添加到集合中
                orgProbList.add(gift.getPoint().doubleValue());
            }
            return draw(orgProbList);
        }
        return -1;
    }

    public static int draw(List<Double> giftProbList){

        List<Double> sortRateList = new ArrayList<Double>();
        // 计算概率总和
        Double sumRate = 0D;
        for(Double prob : giftProbList){
            sumRate += prob;
        }

        if(sumRate != 0){
            double rate = 0D;   //概率所占比例
            for(Double prob : giftProbList){
                rate += prob;
                // 构建一个比例区段组成的集合(避免概率和不为1)
                sortRateList.add(rate / sumRate);
            }

            // 随机生成一个随机数,并排序
            double random = Math.random();
            sortRateList.add(random);
            Collections.sort(sortRateList);

            // 返回该随机数在比例集合中的索引
            return sortRateList.indexOf(random);
        }
        return -1;
    }


相关文章

  • 抽奖算法

    最近要实现一个抽奖的功能;根据权重来决定奖品;其实就是数学里的概率问题;概率越大被选中的机会就越大;简单实现了一个...

  • 抽奖算法

    有大佬能写出优于以上算法的更好算法吗?共同学习,欢迎留言交流

  • php实现刮刮卡大转盘抽奖概率

    php实现刮刮卡大转盘抽奖概率 本文实例为大家分享了php中奖概率算法,可用于刮刮卡,大转盘等抽奖算法,用法很简单...

  • 抽奖

    1.获取活动信息 2.获取抽奖结果 3.中奖算法DPrizeHelper::prize();

  • php 权重随机3种算法

    权重随机算法在产品开发中或多或少都遇到,如抽奖,集群服务器中的负载均衡。下面我以抽奖为例: $arr = arra...

  • 抽奖功能实现(纯算法)

    权重的概念 简单的将权重就是某个奖品的中奖率,总权重就是所有的中奖率相加得到的总数(当然如果是抽奖的话所有奖品加起...

  • 大转盘抽奖概率算法

    大转盘方式的抽奖是经常见的,,最近在做了一个抽奖的功能,其中最重要的就是概率,概率的算法大同小异,,为保证每个奖品...

  • EOS佳能抽奖算法之Hash

    EOS佳能的抽奖,一等奖奖金丰厚,着实让人激动不已,虽然已经料到自己最大的概率就是中一个0.1个EOS,但还是对大...

  • 关于抽奖概率的测试

    抽奖程序设定的算法:把设定的中奖概率从小到大排序(0.1、0.15、0.25、0.5),划分区间([0,0...

  • 文末||抽奖,抽奖,抽奖

    关注公众号“14摄氏度” 转发朋友圈截图发送给后台获取抽奖密令 人工审核请耐心等待 10月8日开奖 因为14摄氏度...

网友评论

      本文标题:抽奖算法

      本文链接:https://www.haomeiwen.com/subject/ipfcqqtx.html