文章目录
- 前言
- 一、思路
- 二、代码实现
- 总结
前言
不出正月都是年,给大家拜个年! 新年好~
过年在群里发红包,然后大家抢红包,红包有大有小,但是刚刚好会被抢完,想着自己实现下吧~~
有感而发~
春节像是做了一场热闹的梦,
车站道别的话语言不由衷,
离别时的行囊总比回家的重,
珍重珍重下次梦中再相逢。
一、思路
我的想法是利用随机数,然后按照人头分配,只要分配合理,那么此次分配就是合理的,否则重新分配;我这里面的合理就是,红包分配的总金额应该与原本的总金额一致。如何保证呢?
比如 我要分成5份,那么我就先分配4份,如果不超过总金额,那么剩余的钱都分给最后一个人;否则重新分配;
二、代码实现
代码如下(示例):
public class Suijihongbao {
public static void main(String[] args) {
int peo = 5;//人数
int yuan = 10;//金额
List<BigDecimal> numList = CollectionUtil.newArrayList();
BigDecimal sum = random(peo, yuan, numList);
BigDecimal bigDecimal = new BigDecimal(yuan);
while (sum.compareTo(bigDecimal) > 0) {// 大于总数,重新分配
numList.clear();
sum = random(peo, yuan, numList);
}
numList.add(bigDecimal.subtract(sum));
System.out.println("分发结果: =============");
for (BigDecimal decimal : numList) {
System.out.println(decimal);
}
}
private static BigDecimal random(int peo, int yuan, List<BigDecimal> numList) {
BigDecimal sum = new BigDecimal(0.00);
for (int i = 0; i < peo - 1; i++) {
BigDecimal bigDecimal = RandomUtil.randomBigDecimal(BigDecimal.ZERO, new BigDecimal(yuan)).setScale(2, RoundingMode.UP);
numList.add(bigDecimal);
}
sum = numList.stream().reduce(BigDecimal.ZERO,BigDecimal::add);
System.out.println("完成了一次分发");
return sum;
}
}
总结
利用bigDecimal 的特性可以保证小数加减的正确性,然后按照上述的"合理" 思路进行分配,不停循环,直到"合理" 为止;
这种写法不太合理,看运气,有时候一次就ok了,但是有时候就会循环很多次; 我知道肯定有更好更合理的实现方式,仅供阅读吧,菜鸡互啄,哈哈哈