话不多说,直接上代码
/**
* 简易随机红包算法
* @param amt 红包金额
* @param count 红包数量
*/
public void sendRandomBonus(BigDecimal amt, int count) {
//转为两位小数表示
amt = amt.setScale(2);
//红包发放数量i
int i = 0;
while (count > 1) {
//获取随机范围上界,两位小数
BigDecimal randomHigh = getRandomHigh(amt, count);
//转int
BigDecimal multiplyHigh = randomHigh.multiply(new BigDecimal(100));
int intValue = multiplyHigh.intValue();
Random rand = new Random();
//进行随机[1,intValue]
int rd = rand.nextInt(intValue) + 1;
//当前红包金额
BigDecimal curRed = new BigDecimal(rd).divide(new BigDecimal(100));
//打印
i++;
System.out.println("第" + i + "个红包金额为:" + curRed);
//更新剩余金额和红包数量
amt = amt.subtract(curRed);
count--;
}
//最后takeAll
i++;
System.out.println("第" + i + "个红包金额为:" + amt);
}
/**
* 计算随机范围上界
* @param amt 当前总剩余金额
* @param count 当前总剩余红包
* @return
*/
private BigDecimal getRandomHigh(BigDecimal amt, int count) {
//前置条件(保证每一次红包被领取之后,剩余的金额至少每人可分得0.01元)
BigDecimal maxRetain = amt.subtract(new BigDecimal("0.01").multiply(new BigDecimal(count - 1)));
//计算本次随机范围的上限,公式:(当前总剩余金额/当前总剩余红包)*2
BigDecimal calHigh = amt.multiply(new BigDecimal(2)).divide(new BigDecimal(count), BigDecimal.ROUND_FLOOR);
//取calHigh和maxRetain二者较小值并返回
int cp = calHigh.compareTo(maxRetain);
return cp > 0 ? maxRetain :calHigh;
}
更多精彩欢迎关注公众号“码农面试帮”~