手撸一个简易版"随机红包算法"

话不多说,直接上代码

/**
 *  简易随机红包算法
 * @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;
}

更多精彩欢迎关注公众号“码农面试帮”~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值