我正在尝试创建一个函数,该函数返回总和固定的随机整数数组。
这是我的代码:
function arraySum(a) {
return a.reduce((a, b) => a + b, 0)
}
function getRandomIntInclusive(min, max) {
const minCeil = Math.ceil(min)
const maxFloor = Math.floor(max)
return Math.floor(Math.random() * (maxFloor - minCeil + 1)) + minCeil
}
function randomNumbersWithFixedSum(quantity, sum) {
const randoms = [...Array(quantity - 1).keys()].map(q => getRandomIntInclusive(0, sum/quantity))
const last = sum - arraySum(randoms)
return [...randoms, last]
}
console.log(randomNumbersWithFixedSum(1, 100))
console.log(randomNumbersWithFixedSum(2, 100))
console.log(randomNumbersWithFixedSum(3, 100))
console.log(randomNumbersWithFixedSum(4, 100))
console.log(randomNumbersWithFixedSum(5, 100))
它有效,但这并不是我想要的。我希望每个数字都是随机的[0, sum]
。在randomNumbersWithFixedSum
函数中,我强制第一个(quantity-1)
数字在中[0, sum/quantity]
,但我不喜欢。
如何创建[0, sum]
总和为的真正随机数sum
?
这是一个很好的例子,其中递归函数可以简化问题。每次执行仅计算一个随机数,然后使用更新的参数进行调用。请参阅注释以获取描述。
function getRandomNumberBetweenIncluding(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
function randomNumbersWithFixedSum(quantity, sum) {
// only a single number required; return the passed sum.
if (quantity === 1) {
return [sum];
}
// Create one random number and return an array containing that number
// as first item. Then use the spread operator and recursively execute
// the function again with a decremented quantity and the updated
// maximum possible sum.
const randomNum = getRandomNumberBetweenIncluding(0, sum);
return [
randomNum,
...randomNumbersWithFixedSum(quantity - 1, sum - randomNum),
];
}
console.log(randomNumbersWithFixedSum(1, 100));
console.log(randomNumbersWithFixedSum(2, 100));
console.log(randomNumbersWithFixedSum(3, 100));
console.log(randomNumbersWithFixedSum(4, 100));
console.log(randomNumbersWithFixedSum(5, 100));
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句