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;
        }
    
    }

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

  • 相关阅读:
    JS兼容性总结
    [妙味DOM]第五课:事件深入应用
    关于iOS开发的学习
    世界经典——乔布斯
    梦想改变世界
    乔布斯在斯坦福大学的演讲
    10步让你成为更优秀的程序员
    程序员的八个级别
    程序员的学习和积累
    哈佛大学二十条训言
  • 原文地址:https://www.cnblogs.com/ooo0/p/11927391.html
Copyright © 2011-2022 走看看