简单红包算法

package com.suyun.test;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

@SpringBootApplication
@EnableScheduling
public class TestApplication {

    public static void main(String[] args) {
        BigDecimal totalMoney = new BigDecimal(10D);
        BigDecimal coefficient = new BigDecimal(0.001D);
        int totalRedPacket = 10;
        int doubleLength = String.valueOf(coefficient.doubleValue()).length() - 2;
        List<BigDecimal> redPacketMoneys = new ArrayList<>();
        distributionRedPacket(totalMoney, coefficient, doubleLength, totalRedPacket, 1, redPacketMoneys);
        BigDecimal totalRedPacketMoney = new BigDecimal("0");
        for (int i = 0; i < redPacketMoneys.size(); i++) {
            System.out.println("红包金额" + redPacketMoneys.get(i));
            totalRedPacketMoney = totalRedPacketMoney.add(redPacketMoneys.get(i));
        }
        System.out.println("红包总金额" + totalRedPacketMoney);
    }

    /**
     * 获取红包金额
     *
     * @param totalMoney         红包剩余总金额
     * @param coefficient        红包金额系数
     * @param doubleLength       小数点后面有多少位
     * @param totalRedPacket     红包总个数
     * @param getRedpacketNumber 当前为第几个红包
     * @param redPacketMoneys 存储红包金额
     * @return 当前红包金额
     */
    public static BigDecimal distributionRedPacket(BigDecimal totalMoney, BigDecimal coefficient, int doubleLength, int totalRedPacket, int getRedpacketNumber, List<BigDecimal> redPacketMoneys) {
        /**
         * 当达到最后一个红包时,直接把剩下的金额给最后一个红包
         */
        if (totalRedPacket < getRedpacketNumber) {
            redPacketMoneys.add(totalMoney);
            return totalMoney;
        }
        /**
         * 获取当前红包的最大值
         */
        BigDecimal money = totalMoney.subtract(coefficient.multiply(new BigDecimal(totalRedPacket - getRedpacketNumber)));
        /**
         * 随机或企业一个金额小于当前总金额减去还剩下多少个红包乘以最低红包金额的金额
         */
        BigDecimal realMoney = new BigDecimal(Math.random() * money.doubleValue()).setScale(doubleLength, BigDecimal.ROUND_DOWN);
        redPacketMoneys.add(realMoney);
        getRedpacketNumber++;
        /**
         * 递归生成红包
         */
        return distributionRedPacket(totalMoney.subtract(realMoney), coefficient, doubleLength, totalRedPacket, getRedpacketNumber, redPacketMoneys);
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值