红包有一个总金额和总数量,领的时候随机分配金额。
维护一个剩余总金额和总数量,分配时,如果数量等于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; } }
如果是这个算法,那先抢好,还是后抢好呢?先抢肯定抢不到特别大的,不过,后抢也不一定会,这要看前面抢的金额,剩下的多就有可能抢到大的,剩下的少就不可能有大的。