0

ランダムな数字の配列を生成しようとしていますが、各行の先頭に「未定義」が表示されます。私は数時間オンラインで検索してきましたが、それを理解することができませんでした。

期待される出力は、次のように2つのランダムな数字の5行である必要があります。

87
57
81
80
02

しかし、実際の出力は次のようになります。

undefined87
undefined57
undefined81
undefined80
undefined02

これは、上記の結果を生成する変更された抜粋です。

function NumberSet() {

  // generate all the digits
  this.generate = function() {
    random_digits = [];

    // create 5 rows of 2 random digits
    for(i=0; i<5; i++) {
      for(z=0; z<2; z++) {
        // use .toString() in order to concatenate digits to 
        // the array without adding them together
        random_digit = Math.floor(Math.random()*10).toString();
        random_digits[i] +=random_digit;
      }
    }
    return random_digits;
  }
}
randomnumbers1 = new NumberSet();
mynums = randomnumbers1.generate();
jQuery.each(mynums, function(i, l) {
  // display output in a div#nums
  $('#nums').append(l + '<br>');
});

最終バージョンでは、このメソッドを使用して数字を表示することはありません。「未定義」がどこから来ているのかをトラブルシューティングしようとしています。

4

4 に答える 4

2

変数を初期化します

 random_digits[i] = "";
 for(z=0; z<2; z++) {
    random_digit = Math.floor(Math.random()*10).toString();
    random_digits[i] +=random_digit;
  }

で変数を適切に宣言しますvar

var random_digit, random_digits = [];
于 2013-03-26T06:44:12.610 に答える
1

random_digit最初のループで宣言しfor、空の文字列を割り当てます。for乱数を追加して内側のループを通過し、次にpush()外側のループに戻って配列に移動しforます。

function NumberSet() {
  // generate all the digits -a meme should be attached here-
  this.generate = function() {
    random_digits = [];

    // create 5 rows of 2 random digits
    for(i=0; i<5; i++) {
      var random_digit = ""; //Declare it out here
      for(z=0; z<2; z++) {
        // use .toString() in order to concatenate digits to 
        // the array without adding them together
        random_digit += Math.floor(Math.random()*10).toString(); //Append it here
      }
      random_digits.push(random_digit); //Push it back here
    }
    return random_digits;
  }
}

フィドルディーディー

または内部ループを忘れて再帰を使用する

function NumberSet() {

    // generate all the digits
    this.generate = function () {
        random_digits = [];

        // create 5 rows of 2 random digits

        // Use i for how many numbers you want returned!
        var random_digit = function (i) {
            var getRand = function() {
                return (Math.floor(Math.random() * 10).toString());
            }
            return (i > 0) ? getRand()+random_digit(i-1) : "";
        };

        for (i = 0; i < 5; i++) {
            random_digits.push(random_digit(2)); //In this case, you want 2 numbers
        }
        return random_digits;
    }
}

Fiddle-do-do

そして、私が退屈しているので、最終バージョン

function NumberSet(elNum, numLen) {
    this.random_digits = []; //Random digits array
    this.elNum = elNum; //Number of elements to add to the array
    this.numLen = numLen; //Length of each element in the array
    // generate all the digits

    this.generate = function () {
        // create 5 rows of 2 random digits
        var random_digit = function (i) {
            var getRand = function () {
                return (Math.floor(Math.random() * 10).toString());
            }
            return (i > 0) ? getRand() + random_digit(i - 1) : "";
        };
        for (i = 0; i < this.elNum; i++) {
            this.random_digits.push(random_digit(this.numLen)); 
        }
        return this.random_digits;
    }
}

randomnumbers1 = new NumberSet(5, 2).generate();

jQuery.each(randomnumbers1, function (i, l) {
    // display output in a div#nums
    $('#nums').append(l + '<br>');
});

屋根をいじる

于 2013-03-26T06:47:43.823 に答える
0

交換

random_digits[i] +=random_digit;

random_digits[i] = (random_digits[i]  == undefined ? '' : random_digits[i]) + random_digit;

デモ:フィドル

于 2013-03-26T06:40:37.443 に答える
0

関数は次のように簡略化できます。

function NumberSet() {

  this.generate = function() {
    var random_digits = new Array();

    for (i = 0; i < 5; i++) {
        randnum = Math.floor(Math.random() * 99);
        random_digits[i] = (randnum < 10 ? '0' : 0) + randnum;
    }
    return random_digits;
  }
}

Live Demo

于 2013-03-26T06:53:44.037 に答える