[英]How to generated N numbers in array that sum of these numbers is equal to 0
我有一個這樣的代碼:
function myArr(N){
let arr = [];
function randomNumber(min,max) {
if (min > max) {
let vMin = min;
min = parseInt(max,10);
max = parseInt(vMin,10);
}
return Math.floor(Math.random()*(max-min+1)+min);
}
for(let i = 0; i < N; i++) {
arr.push(randomNumber(100,-100));
}
return arr;
}
此函數生成一個包含 N 個數字的數組。 但我希望這些生成數字的總和等於 0。如何做到? 我正在考慮有條件的“如果”,但我不完全知道,在這種情況下如何使用它......也許你們中的一些人知道,如何做到這一點? 感謝您提供任何提示!
在生成數字時,您必須確保數字保持接近於零,然后生成 N - 1 個數字並計算最后一個:
const arr = [];
let sum = 0;
for(let i = 0; i < N - 2; i++) {
let number;
if(sum >= 100) {
number = randomNumber(100 - sum, -100);
} else if(sum <= -100) {
number = randomNumber(100, -100 - sum);
} else {
number = randomNumber(100, -100);
}
sum += number;
arr.push(number);
}
arr.push(Math.floor(-sum / 2), Math ceil(-sum / 2));
(不適用於 N < 4)
有很多方法可以生成一組加起來為零的隨機生成的值,但它們對值的分布都有不同的影響。
例如,一種簡單的方法是首先生成值並計算它們的平均值,然后從每個值中減去該平均值。 這樣做的結果是這些值可能會超出您最初想要的范圍; 例如,如果您隨機生成 [100, 100, 100, -100],則平均值為 50,因此您最終會得到 [50, 50, 50, -150]。 你可以通過從比你真正需要的更窄的范圍開始來彌補這一點; 但這意味着在該較窄范圍內或附近的值比接近整個范圍末尾的值更有可能出現。
另一種簡單的方法是僅生成n / 2 個值,並且對於您生成的每個值,包括該值及其算術逆(例如,如果您生成 37,那么您的結果將包括 37 和 -37)。 然后你可以隨機打亂結果; 因此,例如,如果您隨機生成 [17, -84, 12],那么您的最終數組可能是 [-12, 17, -84, -17, 84, 12]。
. . . 所有這些都是說您需要弄清楚您的確切要求。 隨機性很復雜!
這是另一種方式。 從零開始並將隨機數組元素拆分 N-1 次:
function myArr(N){ let arr = [0]; function randomNumber(min,max) { if (min > max) { let vMin = min; min = parseInt(max,10); max = parseInt(vMin,10); } return Math.floor(Math.random()*(max-min+1)+min); } function split(n){ let low = Math.max(-100, n - 100); let high = Math.min(100, n + 100); let r = randomNumber(low, high); return [r, n - r] } for(let i = 0; i < N-1; i++) { let idx = ~~(Math.random() * arr.length); let newNums = split(arr[idx]); arr[idx] = newNums[0]; arr.push(newNums[1]); } return arr; } console.log(myArr(5));
這是我的解決方案,基本上你做一個 for 循環並開始添加元素。
每當添加元素時,只需添加相同的元素 * -1
您最終將得到一個總和為 0 的元素數組。
function arrayOfSumZero(N) {
let sum = 0;
let i = N % 2 === 0 ? 0 : 1;
let output = [];
for (i; i < N; i++) {
if (output.length < N) {
sum += i;
output.push(i);
}
if (sum > 0) {
sum += i * -1;
output.push(i * -1);
}
}
return output;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.