- List redInfoList = new ArrayList<>();
- // 红包有误
- if(num < REDPACK_MIN_QUANTITY || num > REDPACK_MAX_QUANTITY)
- return redInfoList;
- //校验:金额大于0
- if(redMoney.compareTo(BigDecimal.ZERO) != 1) {
- return redInfoList;
- }
- if(num <= 1) {
- redInfoList.add(redMoney);
- return redInfoList;
- }
- Random random =new Random();
- for(inti = 0; i < num; i++) {
- // System.out.println("\n" + (i+1) + "个红包信息:");
- intsurplusNum = num - i;//未分配金额红包数量BigDecimal curRedMoney = fightLuckRedPacked(redMoney, surplusNum, random, ERROR_INIT_NUM);
- redInfoList.add(curRedMoney);
- redMoney = redMoney.subtract(curRedMoney);
- // MandoAssert.notTrue(redMoney.compareTo(BigDecimal.ZERO) == -1, "红包金额有误");
- // System.out.println("红包金额:" + curRedMoney + ",剩余:" + redMoney);
- }
- return redInfoList;
- }
- /**
- * 拼手气红包
- * @param redMoney 红包金额
- * @param num 红包数量
- * @param random 随机数生成对象
- * @param errorNum 错误测试
- * @return 单个红包金额
- */
- private staticBigDecimal fightLuckRedPacked(BigDecimal redMoney,intnum, Random random,int errorNum) {
- if(num <= 1) {
- return redMoney;
- }
- if(errorNum > ERROR_MAX_NUM) {
- //随机金额产生错误次数超过上限,返回最小值
- return SINGLE_RED_MIN_MONEY;
- }
- //每个红包最大金额 = 剩余总金额 / 未分配金额红包数量 * 红包放大倍数
- intavgRedMaxMoney = redMoney.divide(newBigDecimal(num), ROUNDING_MODE).multiply(TIMES).intValue() * FRACTION_LENGTH;
- BigDecimal curRedMoney =newBigDecimal(random.nextInt(avgRedMaxMoney) * 1.00 / FRACTION_LENGTH + "").setScale(SCALE, ROUNDING_MODE);
- if(curRedMoney.compareTo(SINGLE_RED_MIN_MONEY) == -1) {
- //红包最小值判断:小于最小红包金额,重新计算
- returnfightLuckRedPacked(redMoney, num, random, ++errorNum);
- }
- /*if(curRedMoney.compareTo(SINGLE_RED_MAX_MONEY) == 1) {
- //红包最大值判断
- return fightLuckRedPacked(curRedMoney, num, random, ++errorNum);
- }*/
- //最少保留红包金额BigDecimal surplusMinRedMoney = SINGLE_RED_MIN_MONEY.multiply(newBigDecimal(num - 1));
- //除当前红包剩余金额BigDecimal surplusRedMoney = redMoney.subtract(curRedMoney);
- if(surplusMinRedMoney.compareTo(surplusRedMoney) == 1) {
- returnfightLuckRedPacked(redMoney, num, random, ++errorNum);
- }
- return curRedMoney;
- }
- public static void main(String[] args) {
- System.out.println(SplitRedPackes(newBigDecimal("100"), 20));
- }
- }
来源: