java 根据最小值和最大值以及数组之和来生成对应的数组

java 复制代码
  /**
     * 生成对应的数组
     *
     * @param totalAmount 需要生成数组的总金额
     * @param num         需要生成数字的个数
     * @param min         最小的金额
     * @param max         最大的金额
     * @return 生成的数组
     * @throws IllegalArgumentException 如果参数无效
     */
    public static int[] lotteryArray(int totalAmount, int num, int min, int max) {
        if (num <= 0 || min < 0 || max <= min || totalAmount < num * min) {
            throw new YshopException("lotteryArray的参数无效");
        }

        int[] rewards = new int[num];
        Random random = new Random();
        int remainingAmount = totalAmount;

        for (int i = 0; i < num - 1; i++) {
            // 确保生成的随机数在min和max之间,并且剩余的总金额足够分配给剩余的所有奖励
            int remainingRewards = num - i;
            int maxPossibleReward = Math.min(remainingAmount / remainingRewards, max);
            int minPossibleReward = Math.max(min, remainingAmount - (remainingRewards - 1) * max);


            // 生成随机奖励
            int reward = minPossibleReward + random.nextInt(maxPossibleReward - minPossibleReward + 1);
//
//            if (reward>max){
//                System.out.println("reward大于max:"+reward);
//            }
//
//            if (reward<min){
//                System.out.println("reward小于min:"+reward);
//            }


            rewards[i] = reward;
            remainingAmount -= reward;
        }

        // 最后一次迭代:直接设置剩余金额,确保总和正确
        rewards[num - 1] = remainingAmount;


        if (rewards[num - 1] < min || rewards[num - 1] > max) {
            // System.out.println("最后一位数递归:"+rewards[num - 1]);
            // 如果最后一个奖励小于min,这通常意味着输入参数不合理,可以递归重新计算
            return lotteryArray(totalAmount, num, min, max);
        }

        // 确保最后生成的总金额是预期的totalAmount
        if (Arrays.stream(rewards).sum() != totalAmount) {
            // 如果总和不对,重新计算整个数组
            // System.out.println("总数不对递归");
            return lotteryArray(totalAmount, num, min, max);
        }

        // System.out.println("rewards:"+ Arrays.toString(rewards) +"---------");

        return rewards;
    }
相关推荐
KaMeidebaby24 分钟前
卡梅德生物技术快报|PD1 单克隆抗体定制配套 N 糖全谱质控开发
前端·人工智能·算法·数据挖掘·数据分析
8Qi81 小时前
LeetCode 235. 二叉搜索树的最近公共祖先(LCA)
算法·leetcode·二叉树·递归·二叉搜索树·lca·迭代
bIo7lyA8v1 小时前
算法稳定性分析中的随机扰动建模的技术8
算法
sugar__salt2 小时前
从栈队列数据结构到JS原型面向对象全解
前端·javascript·数据结构
科研online2 小时前
基于多源数据和XGBoost-SHAP分析中国大陆绿地碳汇空间变异影响因素的非线性相关性与尺度差异
算法·学习方法
Cthy_hy2 小时前
拓扑排序超详解:原理 + Kahn 贪心算法
python·算法·贪心算法
三品吉他手会点灯3 小时前
C语言学习笔记 - 43.运算符与表达式 - 运算符1 - 运算符的分类和简单介绍
c语言·笔记·学习·算法
心之伊始3 小时前
Java 后端接入大模型:从 Token、并发到推理成本的完整估算方法
java·spring boot·性能优化·大模型·llm
VkN2X2X4b3 小时前
算法复杂度的实验验证与误差分析的技术8
算法
其利天下技术3 小时前
风扇灯无刷电机自适应算法实战指南
算法·cocos2d·无刷电机自适应算法·bldc驱动自适应算法·其利无刷电机驱动算法