随机红包生成工具类

随机红包生成工具类

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

public class HBGenerateUtil {


    public static void main(String[] args) {
        generateHbList(BigDecimal.valueOf(300),BigDecimal.valueOf(90),BigDecimal.valueOf(3),BigDecimal.valueOf(1));
    }


    /**
     *  生成随机红包金额列表
     * @param totalAmt 总金额
     * @param totalNum 总数量
     * @param maxSingleAmt 最大单笔金额
     * @param minSingleAmt 最小单笔金额
     * @return 生成随机红包列表
     */
    public static List<BigDecimal> generateHbList(BigDecimal totalAmt, BigDecimal totalNum, BigDecimal maxSingleAmt, BigDecimal minSingleAmt){

        BigDecimal checkAmt = totalAmt;
        BigDecimal checkNum = totalNum;

        List<BigDecimal> hbList = new ArrayList<>();

        int loop = totalNum.intValue();
        for (int i = 1; i <= loop; i++) {
            if(i != loop){
                BigDecimal singleHb = singleHb(totalAmt,totalNum,maxSingleAmt,minSingleAmt);
                // 总红包金额递减
                totalAmt = totalAmt.subtract(singleHb);
                // 总包数量递减
                totalNum = totalNum.subtract(BigDecimal.ONE);
                hbList.add(singleHb);
            }else{
                BigDecimal singleHb = totalAmt;
                hbList.add(singleHb);
            }
        }
        // 打乱顺序
        Collections.shuffle(hbList);
        // 效验
        checkHbList(hbList,checkAmt,checkNum);
        return hbList;
    }


    /**
     * 效验红包生成的是否完美
     * @param hbList 红包列表
     * @param valueOf 效验的红包总金额
     * @param valueOf1 效验的红包数量
     */
    private static void checkHbList(List<BigDecimal> hbList, BigDecimal valueOf, BigDecimal valueOf1) {
        BigDecimal totalAmt = new BigDecimal(0);
        for (int i = 0; i < hbList.size(); i++) {
            BigDecimal singleHb = hbList.get(i);
            totalAmt = totalAmt.add(singleHb);
        }
        if(valueOf.compareTo(totalAmt) == 0 && hbList.size() == valueOf1.intValue()){
            System.out.println("效验成功!");
        }else{
            System.out.println("效验失败!");
        }
    }


    /**
     * @return 单红包金额
     */

    public static BigDecimal singleHb(BigDecimal totalAmt,BigDecimal totalNum,BigDecimal maxSingleAmt,BigDecimal minSingleAmt){
        // 生成单个红包
        // 生成随机小数 0-1
        double random = Math.random();
        BigDecimal singleHb = (maxSingleAmt.subtract(minSingleAmt)).multiply(BigDecimal.valueOf(random)).add(minSingleAmt);
        singleHb = singleHb.setScale(2,BigDecimal.ROUND_HALF_DOWN);

        // 剩余钱包金额
        BigDecimal surplus = totalAmt.subtract(singleHb);
        // 效验生成红包是否合理
        // 是否过大
        if(surplus.compareTo(
                minSingleAmt.multiply(totalNum.subtract(BigDecimal.valueOf(1)))
        ) < 0){
            return minSingleAmt;
        }

        // 是否过小
        if(surplus.compareTo(
                maxSingleAmt.multiply(totalNum.subtract(BigDecimal.valueOf(1)))
        ) > 0){
            // 重新生成  缩小最小值
            BigDecimal newMinSingleAmt = totalAmt.subtract(maxSingleAmt.multiply(totalNum.subtract(BigDecimal.valueOf(1))));
            singleHb = (maxSingleAmt.subtract(newMinSingleAmt)).multiply(BigDecimal.valueOf(random)).add(newMinSingleAmt);
            singleHb = singleHb.setScale(2,BigDecimal.ROUND_HALF_DOWN);
        }
        return singleHb;

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值