过年发红包的思考

52 阅读1分钟

文章目录


前言

不出正月都是年,给大家拜个年! 新年好~
过年在群里发红包,然后大家抢红包,红包有大有小,但是刚刚好会被抢完,想着自己实现下吧~~


有感而发~
春节像是做了一场热闹的梦,
车站道别的话语言不由衷,
离别时的行囊总比回家的重,
珍重珍重下次梦中再相逢。

一、思路

我的想法是利用随机数,然后按照人头分配,只要分配合理,那么此次分配就是合理的,否则重新分配;我这里面的合理就是,红包分配的总金额应该与原本的总金额一致。如何保证呢?
比如 我要分成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了,但是有时候就会循环很多次; 我知道肯定有更好更合理的实现方式,仅供阅读吧,菜鸡互啄,哈哈哈

本文转自 jimolvxing.blog.csdn.net/article/det…,如有侵权,请联系删除。