Java红包随机算法深入简出

Java红包随机算法

Java红包随机算法的实现方式有多种,以下是其中一种实现方式的详细说明:

1. 首先输入红包总金额和红包个数,代码里单位为(分)。

2. 确定每个红包最小金额,即总金额除以红包个数得到平均数除以二,根据具体业务去定最小值。

3. 确定每个红包最大金额,即总金额乘以定义的平均值的几倍(TIMES)除以数量。

以下是Java代码实现:

package com.dsj;

import java.util.ArrayList;
import java.util.List;

/**
 * @ClassName RedPacketUtil
 * @Description TODO 红包随机算法
 * @Author dsj
 * @Date 2023/9/12 8:53 AM
 */
public class RedPacketUtil {

    /**
     *  为了避免不公平性某一个红包金额数大,我们设定非最后红包最大金额,我们吧他设置成平均值的几倍
     */
    private static final double TIMES = 2.5;

    /**
     * 拆分红包
     *
     * @param money 红包总金额
     * @param minMoney 最小金额 (单位:分)
     * @param maxMoney 最大金额(单位:分)
     * @param num 个数
     * @return
     */
    public static List<Integer> splitRedBags(int money, int minMoney, int maxMoney,
                                             int num) {
        // 红包 合法性校验
        if (!isRight(money, minMoney, maxMoney, num)) {
            return null;
        }
        // 红包列表
        List<Integer> list = new ArrayList<Integer>();
        // 每个红包最大的金额为平均金额的Times 倍
        int max = (int) (money * TIMES / num);

        max = max > maxMoney ? maxMoney : max;
        // 分配红包
        for (int i = 0; i < num; i++) {
            int one = random(money, minMoney, max, num - i);
            list.add(one);
            money -= one;
        }
        return list;
    }

    /**
     * 随机分配一个红包
     * @param money 红包总金额
     * @param minS 最小金额
     * @param maxS 最大金额(每个红包的默认Times倍最大值)
     * @param num 个数
     * @return
     */
    private static int random(int money, int minS, int maxS, int num) {
        // 红包数量为1,直接返回金额
        if (num == 1) {
            return money;
        }
        // 如果最大金额和最小金额相等,直接返回金额
        if (minS == maxS) {
            return minS;
        }
        int max = maxS > money ? money : maxS;
        // 分配红包正确情况,允许红包的最大值
        int maxY = money - (num - 1) * minS;
        // 分配红包正确情况,允许红包的最小值
        int minY = money - (num - 1) * maxS;
        // 随机产生红包的最小值
        int min = minY > minS ? minY : minS;
        // 随机产生红包最大值
        max = maxY < max ? maxY : max;
        // 随机产生一个红包
        return (int) Math.rint(Math.random() * (max - min) + min);
    }

    /**
     * 红包 合法性校验
     * @param money 红包总金额
     * @param minMoney 最小金额 (单位:分)
     * @param maxMoney 最大金额(单位:分)
     * @param num 个数
     * @return 返回当前是否合法
     */
    private static boolean isRight(int money, int minMoney, int maxMoney, int num) {
        double avg = money / num;
        if(minMoney < 2){
            return false;
        }
        // 小于最小金额
        if (avg < minMoney) {
            return false;
            // 大于最大金额
        } else if (avg > maxMoney) {
            return false;
        }
        return true;
    }



        public static void main(String[] args) {
            //红包总金额单位(分)
            int money = 10000;
            //红包个数
            int num = 10;
            //每个红包最小金额 根据实际情况去定义最小值 我这里为平均值的一半
            int minAmount = money / num / 2;
            // 每个红包最大金额
            int max = (int) (money * TIMES / num);
            List<Integer> moneyList = splitRedBags(money, minAmount, max, num);
            System.out.println(moneyList);
        }

}


你可能感兴趣的:(java,算法,开发语言)