我希望将包含随机数(0到10)的数组推入一个更大的数组,一旦其内容的总和即将超过30.但是输出混乱了。
var bigarray = new Array();
var smallarray = new Array();
var randNum = 0;
var total = 0;
for (var i = 0; i<10; i++){
randNum = (10*Math.random()).toFixed(0);
total = total + randNum;
if(total>30) {
bigarray.push(smallarray)
smallarray.length=0;
smallarray.push(randNum);
total = randNum;
} else {
smallarray.push(randNum);
}
}
alert(" BIG ARRAY IS "+bigarray);
答案 0 :(得分:0)
我对您的代码进行了更改并想出了这个。
var bigarray = [];
var smallarray = [];
var randNum = 0;
var total = 0;
for (var i = 0; i < 10; i += 1) {
randNum = Math.floor(10 * Math.random()); // you will never have a value of 10?
total = total + randNum;
if (total > 30) {
bigarray.push(smallarray.slice())
smallarray.length = 0;
smallarray.push(randNum);
total = randNum;
} else {
smallarray.push(randNum);
}
}
alert(" BIG ARRAY IS " + bigarray);
上
我改变的是:
运行代码将您对new Array
的使用更改为[]
{}和[]
使用{}代替新的Object()。使用[]代替new Array()。
因为用户可以覆盖对象和数组
将++
更改为+= 1
这种模式可能令人困惑。
结帐Code Conventions for the JavaScript Programming Language和jslint
在您将smallarray
推送到bigarray
时添加了array.slice,在这种情况下会生成副本。重要的是要了解javascript的工作方式,阅读Is JavaScript a pass-by-reference or pass-by-value language?不使用slice,因为数组只包含基元,因此当数组的长度设置为0时,数据就会丢失。
将number.toFixed的使用更改为Math.floor,以便randNum保持为数字
注意:Math.random返回[0,1]范围内的浮点伪随机数,从0(含)到0但不包括1(不包括)
您的代码现在是否产生预期的输出,我无法从您的描述中确定,但这应该是一个很好的起点。
答案 1 :(得分:0)
代码中第一眼看到两个错误的东西
(1)而不是
randNum = (10*Math.random()).toFixed(0);
你可能想要
randNum = Math.floor(11*Math.random());
0 <= Math.random() < 1
(2)以下行将(多次)推送推送到同一个smallarray对象。
bigarray.push(smallarray);
在下一步中,使用smallarray.length = 0
清除阵列。由于数组未复制到bigarray,只是被引用,因此生成的项目将丢失。
编辑:我读错了你的问题 - 答案的其余部分已修复
您可能希望将smallarray的副本推送到bigarray,因此请使用以下内容替换上面的行:
bigarray.push(smallarray.slice(0));
答案 2 :(得分:0)
var bigarray = new Array();
var smallarray = new Array();
var randNum = 0;
var total = 0;
for (var i = 0; i < 10; i++) {
for (var j = 0; j < smallarray.length; j++) {
total = total + smallarray[j];
}
if (total <= 30)
{
randNum = Math.floor((Math.random() * 10) + 1);
smallarray.push(randNum);
}
else {
bigarray.push(smallarray.slice(0));
smallarray.length = 0;
}
total = 0;
}
alert(" BIG ARRAY IS " + bigarray);
答案 3 :(得分:0)
你需要在主要的一个循环中填充smallarray,例如:
var bigarray = new Array();
for (var i = 0; i<10; i++){
// moving the variable declarations inside this loop means they are re-set for each small array
var smallarray = new Array();
// create the first entry for the small array
var randNum = Math.floor(11*Math.random());
var total = randNum;
// loop to populate the small array
while(total <= 30){
smallarray.push(randNum);
randNum = Math.floor(11*Math.random());
total += randNum;
}
bigarray.push(smallarray)
}