美文网首页
权重抽奖

权重抽奖

作者: M_ENG | 来源:发表于2019-05-22 20:13 被阅读0次

思路

随机数生成范围:0-1(不包含1) Math.random();
概率 = 权重 / 总权重 (概率一定是 小于 1的)
判断概率是在哪个权重概率范围内

//举例 总权重为10 随机数为 0.431213
//第一个奖品权重为 2 权重概率为 0.2
//第二个奖品权重为 3 权重概率为 0.3
//第三个奖品权重为 4 权重概率为 0.4
//第四个奖品权重为 1 权重概率为 0.1
1:循环奖品,计算权重概率
2:第一个奖品权重概率 0.2 是否 > 随机数0.431213 不大于继续当前循环
3:第二个奖品权重概率 0.3
当不是第一个奖品时,需要加上之前的权重概率 : 0.3 + 0.2 = 0.5 是否 > 随机数0.431213 大于 = 中奖
当循环到第二个奖品时 随机数一定是大于 上一个奖品的权重概率的

public String lootteryDraw(List<LotteryDraw> lotteryDrawList
{
        //总权重
        BigDecimal brandSumWeight = new BigDecimal(0);

        //中奖ID
        String lotteryDrawId = "";

        //1:计算总权重
        for(LotteryDraw lotteryDraw : lotteryDrawList)
        {
            brandSumWeight = brandSumWeight.add(new BigDecimal(lotteryDraw.getWeight()));
        }

        // do{}while()  判断如果lotteryDrawId为空 出现的肯是
        //所有权重概率和相加不等于1  因为 权重 / 总权重 会有除不尽
        //随机数正好大于 所有权重概率和 小于 1 
        //例如:随机数0.9999   权重概率和: 0.999999
        do
        {
            BigDecimal probability = BigDecimal.valueOf(Math.random());

            //判断随机数是否等于0  如果等于0 重新随机
            while(probability.doubleValue() == 0)
            {
                probability = BigDecimal.valueOf(Math.random());
            }

            BigDecimal precent = new BigDecimal(0);

            for(int i = 0; i < lotteryDrawList.size(); i++)
            {
                LotteryDraw lotteryDraw = lotteryDrawList.get(i);

                BigDecimal bigDecimalWeight = new BigDecimal(lotteryDraw.getWeight());

                //权重概率相加  除不尽 小数8为 四舍五入
                precent = precent.add(bigDecimalWeight.divide(brandSumWeight,8,BigDecimal.ROUND_HALF_UP));

                double resultStart = probability.subtract(precent).doubleValue();

                if(resultStart > 0)
                {
                    continue;
                }
                else
                {
                    //抽中
                    lotteryDrawId = lotteryDraw.getLotteryDrawId();

                    break;
                }
            }

        }
        while (lotteryDrawId.equals(""));

        return lotteryDrawId;
 }

相关文章

  • 权重抽奖

    思路 随机数生成范围:0-1(不包含1) Math.random();概率 = 权重 / 总权重 (概率一定是 小...

  • 根据权重抽奖..

    根据用户名(id)和权重抽奖 test_model运行结果 权重: 1 此权重中奖次数: 49514权重: 2 此...

  • 抽奖权重工具

    工作中近期涉及到了抽奖,总结了一个小的权重抽奖工具,分享给大家

  • 简书漫游|新人创收篇(二)

    (2)通过抽奖等途径增加自己的权重 权重,就是我们的资产与拥有的加成卡的和,权重越高,每天获得的投票收益越多。 加...

  • php 权重随机3种算法

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

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

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

  • 天天转盘广告购物,退货无门,智商税吧!

    作为新手的我,每天除了日更,还要参与“天天抽奖”,以此获得加成卡,还增加文章发布后互动的权重。 参与抽奖的友友都知...

  • 今天点赞权重5.41 w

    "天天抽奖", 每日不忘。 右上角红包, 定时观望。 加成卡增多, 点赞权重就高。 不花一分钱, 咱和铁粉收入高高。

  • 持钻越多,能量值恢复就越慢?

    前天抽奖抽到了10000钻,心里当然很高兴。原因就是持钻多了,个人权重增加,相同的文章,在阅读量相同的情况下,收益...

  • 权重随机(Weight random)算法详解

    应用场景 客户端负载均衡,例如 Nacos 提供的客户端负载均衡就是使用了该算法 游戏抽奖(普通道具的权重很高,稀...

网友评论

      本文标题:权重抽奖

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