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

コードで一目でわかる 2 つの間違った点

(1)の代わりに

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

あなたはおそらく欲しい

randNum = Math.floor(11*Math.random());
  • toFixed() の代わりに Math.floor - @kennebec コメントを参照
  • 10 の代わりに 11 を使用して、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 = [];
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() の代わりに [] を使用します。

オブジェクトと配列はユーザ​​ーが上書きできるため

++に変更+= 1

このパターンは混乱を招く可能性があります。

JavaScript プログラミング言語jslintのコード規則を確認してください。

にプッシュすると、 array.sliceが追加されました。この場合、コピーが作成されます。JavaScript がどのように機能するかを理解することが重要です。JavaScript は参照渡しまたは値渡しの言語ですか? 配列にプリミティブのみが含まれているためコピーを作成するスライスを使用しないと、配列の長さを 0 に設定すると、データが失われました。smallarraybigarray

number.toFixedの使用をMath.floorに変更して、randNum が数値のままになるようにしました

注: Math.randomは [0, 1] の範囲、つまり 0 (含む) から 1 (含まない) までの浮動小数点の疑似乱数を返します。

あなたのコードが期待される出力を生成するかどうかは、あなたの説明からはわかりませんが、これは良い出発点になるはずです。

于 2013-04-28T18:40:16.440 に答える
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 に答える