该算法是一种常见的红包随机分配算法,通过生成随机金额数组和随机数数组,将随机金额打散并排序,保证每个人获得的金额是随机的。同时,算法也考虑了总金额不能小于总人数,每个人至少一分钱的情况。

public static List<Integer> splitRedPacket(int amount, int total) {
        // 总金额不能小于总人数(即每人至少一分钱),总人数不能少于1人
        if (amount < total || total < 1) {
            throw new RuntimeException('总金额不能小于总人数');
        }

        // 随机金额数组
        int[] amountArr = new int[total];
        // 剩余金额
        int surplusAmount = amount;
        // 剩余个数
        int surplusTotal = total;
        for (int i = 0; i < total - 1; i++) {
            // 金额除以总个数
            int max = (surplusAmount / surplusTotal) * 2;
            // 本次生成的随机金额,区间:[1,max)
            int randomAmount = random.nextInt(max - 1) + 1;
            amountArr[i] = randomAmount;
            // 剩余金额减少,剩余人数-1
            surplusAmount -= randomAmount;
            surplusTotal--;
        }
        // 为保证红包正好分完,最后一个人的随机金额=剩余金额
        amountArr[amountArr.length - 1] = surplusAmount;

        // 再将生成的随机金额打散:对每个随机金额对应生成一个随机数,然后将这些随机数排序
        TreeMap<Integer, Integer> map = getRandomSortAmount(total);
        return map.values().stream().map(e -> amountArr[e]).collect(Collectors.toList());
    }

但是,由于随机数的生成方式和排序方式并不是唯一的,因此可能会存在一定的偏差。另外,该算法也没有考虑到红包金额的分布情况,可能会导致某些人获得的金额过多或过少。因此,在实际应用中,需要根据具体情况选择合适的算法或进行适当的优化。

Java 红包随机分配算法实现及优缺点分析

原文地址: https://www.cveoy.top/t/topic/m2wt 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录