package com.feifei.demo.arithmetic;
import java.math.BigDecimal;
import java.util.Random;
/**
*
* 指定红包算法,红包金额,红包数,最大值,最小值
*/
public class Test {
public static void main(String[] args) {
deliveryMoney(BigDecimal.valueOf(100), 10, BigDecimal.valueOf(0), BigDecimal.valueOf(12));
}
/**
*
* 保证每次分配完成后都能够使剩余金额总量 <= (number - k) * max 的最大值
* k为领取的红包数
* @param totalMoney 总金额
* @param number 红包数
* @param min 最小金额
* @param max 最大金额
*/
public static void deliveryMoney(BigDecimal totalMoney, int number, BigDecimal min, BigDecimal max) {
int k = 1;
// 记录剩余金额
BigDecimal remainMoney = totalMoney;
while (k <= number) {
if (k == number) {
System.out.println("第" + k + "次分配的红包为:" + remainMoney);
break;
}
// 开始分配红包
BigDecimal scale = BigDecimal.valueOf(new Random().nextDouble() * (max.subtract(min).doubleValue())).setScale(2, BigDecimal.ROUND_HALF_UP);
BigDecimal money = min.add(scale);
// 临时剩余总金额
BigDecimal tempRemainMoney = remainMoney.subtract(money).setScale(2, BigDecimal.ROUND_HALF_UP);
// 如果剩余金额要大于最大的金额, 获取剩余总金额小于最小的金额,则重新分配
if (tempRemainMoney.compareTo(max.multiply(BigDecimal.valueOf(number - k))) > 0 || tempRemainMoney.compareTo(min.multiply(BigDecimal.valueOf(number - k))) < 0) {
continue;
}
System.out.println("第" + k + "次分配的红包为:" + money);
remainMoney = remainMoney.subtract(money);
k++;
}
}
}
这个算法的结果就是会造成一种趋势,趋势就是基本上所有的红包在最后几个都无限接近于最大值。随机性不是很好,欢迎各位大牛留言,直接指出可优化点都可以,虚心求教。