1

一旦其内容的总数即将超过 30,我想将包含随机数(0 到 10)的数组推入一个更大的数组中。但是输出搞砸了。

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);
4

4 回答 4

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);
于 2013-04-28T20:28:09.317 回答
0

在代码中第一眼就可以看到两个错误的东西

(1)代替

randNum = (10*Math.random()).toFixed(0);

你可能想要

randNum = Math.floor(11*Math.random());
  • Math.floor 而不是 toFixed() - 请参阅@kennebec 评论
  • 11 而不是 10 返回数字 0 到 10,如0 <= Math.random() < 1

(2)以下行(多次)将引用推送到同一个 smallarray 对象。

bigarray.push(smallarray);

在下一步中,您使用 清除数组smallarray.length = 0。因为数组没有复制到 bigarray,而只是引用,所以生成的项会丢失。

编辑:我读错了你的问题 - 其余的答案是固定的

您可能希望将 smallarray 的副本推送到 bigarray,因此将上面的行替换为以下内容:

bigarray.push(smallarray.slice(0));
于 2013-04-28T18:48:16.300 回答
0

您需要在主循环中使用另一个循环来填充小数组,例如:

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)
}
于 2013-04-28T21:14:42.350 回答
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);

jsfiddle 上

我改变的事情是:

通过美化器运行代码

将您的使用更改new Array[]

{} 和 []

使用 {} 而不是 new Object()。使用 [] 而不是 new Array()。

因为 Object 和 Array 可以被用户覆盖

改为++_+= 1

这种模式可能会令人困惑。

查看JavaScript 编程语言jslint的代码约定

当你 push 时添加了array.slice,在这种情况下会生成一个副本。了解 javascript 的工作原理很重要,请阅读JavaScript 是按引用传递还是按值传递语言?不使用切片,因为数组只包含原语,所以当你将数组的长度设置为 0 时,数据就会丢失。smallarraybigarray

将number.toFixed的使用更改为Math.floor以便 randNum 保持数字

注意:Math.random返回 [0, 1] 范围内的浮点伪随机数,即从 0(包括)到但不包括 1(不包括)

您的代码现在是否产生了您的预期结果,我无法从您的描述中确定,但这应该是一个很好的起点。

于 2013-04-28T18:40:16.440 回答