You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Javascript生成总和为指定最大值的随机数值数组

JavaScript 实现总和固定的随机数组生成方案

实现思路

  • 先做输入合法性校验,避免参数错误导致死循环或无效输出
  • 每次生成随机数的上限取「前一个数值(首次取总最大值)」和「剩余可分配额度」的最小值,既保证不会超出总配额,也满足后一个数不大于前一个的要求
  • 如果指定了固定元素数量,最后一个元素直接取剩余所有额度,保证总和严格等于给定的最大值
  • 如果没有指定元素数量,就持续生成随机数直到剩余额度耗尽即可

完整实现代码

function getRandomNumbers(max, amountOfNumbers) {
  // 输入合法性校验
  if (max <= 0) return [];
  // 判断是否为不指定数量、生成到额度用完的模式
  const generateUntilEmpty = !amountOfNumbers;
  if (!generateUntilEmpty && (amountOfNumbers <= 0 || amountOfNumbers > max)) {
    throw new Error('元素数量不能小于1,且不能大于总和最大值');
  }

  const result = [];
  let remaining = max;
  // 上一个数值,初始上限为总最大值
  let prevNum = max;

  while (generateUntilEmpty ? remaining > 0 : result.length < amountOfNumbers) {
    // 指定元素数量的场景下,最后一个元素直接取剩余额度,保证总和刚好匹配
    if (!generateUntilEmpty && result.length === amountOfNumbers - 1) {
      result.push(remaining);
      break;
    }
    // 计算当前随机数可使用的最大值
    const currentMax = Math.min(prevNum, remaining);
    // 预留出剩余元素每个至少1的额度,避免最后凑不齐
    const reserved = generateUntilEmpty ? 0 : (amountOfNumbers - result.length - 1);
    // 生成1到上限区间的随机整数
    const randomNum = Math.floor(Math.random() * (currentMax - reserved)) + 1;
    result.push(randomNum);
    remaining -= randomNum;
    prevNum = randomNum;
  }

  return result;
}

测试示例

// 测试1:总和100,不指定元素数量
console.log(getRandomNumbers(100));
// 输出示例:[50, 23, 12, 10, 3, 2]

// 测试2:总和100,指定3个元素
console.log(getRandomNumbers(100, 3));
// 输出示例:[95, 3, 2]

// 测试3:总和50,指定20个元素
console.log(getRandomNumbers(50, 20));
// 输出示例:[10, 3, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 2]

如果你不需要严格要求后一个数小于前一个,只需要删除prevNum = randomNum这行代码,将每次计算的currentMax改为remaining即可,就能输出[1, 1, 2, 3, 10...]这类后数更大的结果。

内容的提问来源于stack exchange,提问作者didntknow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 09:48:02