一个随机数,总是使总数为100的数组



嗨,我正在尝试创建一个基于随机数的数组,该数组的总数始终为100。当有2或3行时,我可以让它工作,但如果有4行,我就不能让它工作。这意味着我需要改变中间部分。以下是我编写的简单代码:(长度是数组中的行数)

var array = []
var length = 3; //4 , 5 , 6 ...
var number;
var calculate;
var totalProcessed;
for (i = 0; i < length; i++) {
// FIRST ONE
if(i == 0){
number = Math.floor(Math.random() * 100) + 1;
console.log(number);
totalProcessed = number;
array.push(number)
}
//  MIDDLE SECTION
if(i > 0 && i == length-1){
if(length > 2){
calculate = 100 - number;
number = Math.floor(Math.random() * calculate) + 1 
totalProcessed = totalProcessed + number;
console.log(number);
array.push(number)
}
}
// LAST ONE
if(i == length -1){    

var lastOne = 100-totalProcessed;
console.log(lastOne);
array.push(lastOne)

}
}
console.log(array);

我应该如何更改中间部分才能捕捉数字?

此代码中有两个错误:

第一个

您应该将==更改为<,以便能够循环3次以上:

if(i > 0 && i == length-1)

第二:

我认为你的错误发生在以下几行。您可以从上一个生成的数字100中减去数字。相反,你应该从剩下的所有东西中生成一个随机数:

calculate = 100 - number;

所以我认为你应该减去totalProcessed值。

calculate = 100 - totalProcessed;

完整的工作片段:

var array = []
var length = 5; //4 , 5 , 6 ...
var number;
var calculate;
var totalProcessed;
for (i = 0; i < length; i++) {
// FIRST ONE
if(i == 0){
number = Math.floor(Math.random() * 100) + 1;
console.log(number);
totalProcessed = number;
array.push(number)
}
//  MIDDLE SECTION
if(i > 0 && i < length-1){
if(length > 2){
calculate = 100 - totalProcessed;
number = Math.floor(Math.random() * calculate) + 1 
totalProcessed = totalProcessed + number;
console.log(number);
array.push(number)
}
}
// LAST ONE
if(i == length -1){    

var lastOne = 100-totalProcessed;
console.log(lastOne);
array.push(lastOne)

}
}
console.log(array);
let total = 0;
array.forEach(el => total += el)
console.log(total)

您应该替换=="在中间部分的if语句中<";。

我发现你的方法有点难以理解。问题设置是否与代码试图执行的操作相同?因此,我写了一个替代例子来解决这个问题(正如目前所解释的):

let limit = 100;
const numbers = [...Array(limit)].map(() => {
const random = Math.floor(Math.random() * 100) + 1;
if (limit - random > 0) {
limit -= random;
return random;
}

return null;
}).concat(limit).filter((num) => num)
console.log(numbers);

它经历了100次迭代(以防只有1:D),然后降低限制。若下一个随机数符合极限,它将被添加到结果中,否则它将为null。

如果在100次迭代后,仍然有剩余的限制,则将其连接到现有数组。最后我们过滤掉所有的";null";(不符合限制的数字)瞧。

最新更新