gpt4 book ai didi

javascript - 生成一组唯一的 N 个随机数,如果所有数字加起来等于 N

转载 作者:行者123 更新时间:2023-11-29 10:58:55 25 4
gpt4 key购买 nike

假设 N = 3,我想做一个函数来生成 3 个唯一的随机数,如果所有数字加起来等于 3。例如:

numbers = [1, 0, 2]
numbers = [2, -4, 5]

我已经在下面的 JavaScript 中有了自己的解决方案:

let i = 0;
let arr = []

function getRandomInt(number) {
return Math.floor(Math.random()*(number*2)) - number;
}

function generateArray(i, arr, number) {
let lastIndex = number-1;

while (i < lastIndex) {
let randomNumber = getRandomInt(number);
if (arr.indexOf(randomNumber) > -1) {
continue;
} else {
arr[i] = randomNumber;
}
i++;
}

let summed = arr.reduce((a, b) => a+b);
let lastNumber = number - summed;
if (arr.indexOf(lastNumber) > -1) {
return generateArray(lastIndex-1, arr, number);
} else {
arr[lastIndex] = lastNumber;
return arr;
}
}

但我仍然对最后一个指标有很大偏差的问题。例如,当 N = 10 时,我可能会得到如下所示的结果:

numbers = [2, -1, 3, 4, -4, 0, -5, -8, -6, 15] 

我想知道你们是否有更好的解决方案和更好的性能。谢谢!

最佳答案

这是一个片段,它首先用 -N 和 N 之间范围内的 N 个唯一数字填充一个数组。

然后替换数组中的最后一个值,使总数 = N。

当重新计算的最终值已经是数组的一部分时,函数将递归。
为了避免最后一个值不是唯一的。
当最终值偏离很大时,它也会递归。

function getArrayRandomNumbersInRange(min, max, N) {
let arr = [];

while(arr.length < N){
let num = Math.floor(Math.random() * (max - min + 1)) + min;
if(arr.indexOf(num) > -1) continue;
arr[arr.length] = num;
}
let total = arr.reduce(function(accum, val) {return accum + val});
let lastElem = arr[arr.length-1] - total + N;
if(lastElem < min || lastElem > max || (total !== N && arr.indexOf(lastElem) > -1)) {
//console.log(lastElem + ' -> recurse');
arr = [];
return getArrayRandomNumbersInRange(min, max, N);
}
arr[arr.length-1] = lastElem;
return arr;
}

function getArrayRandomNumbers(N){
return getArrayRandomNumbersInRange(-N, N, N);
}

function sumArray(arr){
return arr.reduce(function(accum, val) {return accum + val})
}

let randomUniqueArray = getArrayRandomNumbers(5);

console.log("Total:\t" + sumArray(randomUniqueArray));
console.log(randomUniqueArray);

关于javascript - 生成一组唯一的 N 个随机数,如果所有数字加起来等于 N,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51235497/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com