如何使用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
相关产品推荐
相关产品推荐

