zoukankan      html  css  js  c++  java
  • java Random 抢红包算法

    红包有一个总金额和总数量,领的时候随机分配金额。

    维护一个剩余总金额和总数量,分配时,如果数量等于1,直接返回总金额,如果大于1,则计算平均值,并设定随机最大值为平均值的两倍,然后取一个随机值,如果随机值小于0.01,则为0.01,这个随机值就是下一个的红包金额。

    /**
     * Created by xc on 2019/11/25
     * 抢红包算法
     */
    public class RandomRedPacket {
    
        private int leftMoney;
        private int leftNum;
        private Random rnd;
    
        public RandomRedPacket(int total, int num) {
            this.leftMoney = total;
            this.leftNum = num;
            this.rnd = new Random();
        }
    
        public synchronized int nextMoney() {
            if (this.leftNum <= 0) {
                throw new IllegalStateException("抢光了");
            }
            if (this.leftNum == 1) {
                return this.leftMoney;
            }
            double max = this.leftMoney / this.leftNum * 2d;
            int money = (int) (rnd.nextDouble() * max);
            money = Math.max(1, money);
            this.leftMoney -= money;
            this.leftNum--;
            return money;
        }
    
    }

    如果是这个算法,那先抢好,还是后抢好呢?先抢肯定抢不到特别大的,不过,后抢也不一定会,这要看前面抢的金额,剩下的多就有可能抢到大的,剩下的少就不可能有大的。

  • 相关阅读:
    this.props.children 踩坑
    3.webpack配置
    2.项目初始化配置
    1项目库的建立
    Idea-代码背景设置
    SpringBoot+nacos-环境切换-配置文件
    Docker-镜像地址无法访问
    端口-映射、开放、定义
    Linux-命令
    Nginx-命令
  • 原文地址:https://www.cnblogs.com/ooo0/p/11927391.html
Copyright © 2011-2022 走看看