红包 java_java 红包规则

List redInfoList = new ArrayList<>();

// 红包有误

if(num < REDPACK_MIN_QUANTITY || num > REDPACK_MAX_QUANTITY)

returnredInfoList;//校验:金额大于0

if(redMoney.compareTo(BigDecimal.ZERO) != 1) {returnredInfoList;

}if(num <= 1) {

redInfoList.add(redMoney);returnredInfoList;

}

Random random= newRandom();for(int i = 0; i < num; i++) {//System.out.println("\n" + (i+1) + "个红包信息:");

int surplusNum = 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);

}returnredInfoList;

}/*** 拼手气红包

*@paramredMoney 红包金额

*@paramnum 红包数量

*@paramrandom 随机数生成对象

*@paramerrorNum 错误测试

*@return单个红包金额*/

private static BigDecimal fightLuckRedPacked(BigDecimal redMoney, int num, Random random, interrorNum) {if(num <= 1) {returnredMoney;

}if(errorNum >ERROR_MAX_NUM) {//随机金额产生错误次数超过上限,返回最小值

returnSINGLE_RED_MIN_MONEY;

}//每个红包最大金额 = 剩余总金额 / 未分配金额红包数量 * 红包放大倍数

int avgRedMaxMoney = redMoney.divide(new BigDecimal(num), ROUNDING_MODE).multiply(TIMES).intValue() *FRACTION_LENGTH;

BigDecimal curRedMoney= new BigDecimal(random.nextInt(avgRedMaxMoney) * 1.00 / FRACTION_LENGTH + "").setScale(SCALE, ROUNDING_MODE);if(curRedMoney.compareTo(SINGLE_RED_MIN_MONEY) == -1) {//红包最小值判断:小于最小红包金额,重新计算

return fightLuckRedPacked(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(new BigDecimal(num - 1));//除当前红包剩余金额

BigDecimal surplusRedMoney =redMoney.subtract(curRedMoney);if(surplusMinRedMoney.compareTo(surplusRedMoney) == 1) {return fightLuckRedPacked(redMoney, num, random, ++errorNum);

}returncurRedMoney;

}public static voidmain(String[] args) {

System.out.println(SplitRedPackes(new BigDecimal("100"), 20));

}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值