尝试写一个抢红包算法

2018-07-26  本文已影响64人  JarryLeo

抢红包算法看似简单,实际还是不简单啊!

public static List<Double> getRedPacketList(double money, int num) {
        List<Double> redPacketList = new ArrayList<>();
        if (num <= 0) {
            return null;
        }
        //先每个红包塞一分钱
        for (int i = 0; i < num; i++) {
            double base = 0.01;
            if (money >= base) {
                redPacketList.add(base);
                money = BigDecimal.valueOf(money).subtract(BigDecimal.valueOf(base)).doubleValue();
            } else {
                redPacketList.add(0.0);
            }
        }
        //再随机剩余的金额
        for (int i = 0; i < num; i++) {
            Double p = redPacketList.get(i);
            if (money <= 0) {
                break;
            } else if (i == num - 1) {
                double pp= BigDecimal.valueOf(p).add(BigDecimal.valueOf(money)).doubleValue();
                redPacketList.set(i, pp);
            } else {
                BigDecimal m = BigDecimal.valueOf(money)
                        .multiply(BigDecimal.valueOf(2))
                        .divide(BigDecimal.valueOf(num - i), BigDecimal.ROUND_HALF_EVEN)
                        .multiply(BigDecimal.valueOf(Math.random()))
                        .setScale(2, BigDecimal.ROUND_HALF_EVEN);
                double pp = BigDecimal.valueOf(p).add(m).doubleValue();
                redPacketList.set(i, pp);
                money = BigDecimal.valueOf(money).subtract(m).doubleValue();
            }
        }
        return redPacketList;
    }
上一篇 下一篇

猜你喜欢

热点阅读