一个大的红包拆分为多个小包,模拟微信红包算法

496 阅读1分钟
public class Test {
    public static BigDecimal getRandomMoney(RedPackage _redPackage) {
        // remainSize 剩余的红包数量
        // remainMoney 剩余的钱
        if (_redPackage.remainSize == 1) {
            _redPackage.remainSize--;
            return _redPackage.remainMoney.setScale(2, BigDecimal.ROUND_DOWN);
        }
        BigDecimal random = BigDecimal.valueOf(Math.random());
        BigDecimal min = BigDecimal.valueOf(0.01);
        BigDecimal halfRemainSize = BigDecimal.valueOf(_redPackage.remainSize).divide(new BigDecimal(2), BigDecimal.ROUND_UP);
        BigDecimal max1 = _redPackage.remainMoney.divide(halfRemainSize, BigDecimal.ROUND_DOWN);
        BigDecimal minRemainAmount = min.multiply(BigDecimal.valueOf(_redPackage.remainSize - 1)).setScale(2, BigDecimal.ROUND_DOWN);
        BigDecimal max2 = _redPackage.remainMoney.subtract(minRemainAmount);
        BigDecimal max = (max1.compareTo(max2) < 0) ? max1 : max2;
        BigDecimal money = random.multiply(max).setScale(2, BigDecimal.ROUND_DOWN);
        money = money.compareTo(min) < 0 ? min : money;
        _redPackage.remainSize--;
        _redPackage.remainMoney = _redPackage.remainMoney.subtract(money).setScale(2, BigDecimal.ROUND_DOWN);
        return money;
    }
    public static void main(String[] args) {
        RedPackage moneyPackage = new RedPackage();
        moneyPackage.remainMoney = BigDecimal.valueOf(100);
        moneyPackage.remainSize = 10;
        List<BigDecimal> list = new ArrayList<>();
        while (moneyPackage.remainSize != 0) {
            BigDecimal randomMoney = getRandomMoney(moneyPackage);
            list.add(randomMoney);
        }
        System.out.println(list.toString());
    }
    static class RedPackage {
        int remainSize;
        BigDecimal remainMoney;
    }
}