0

こんにちは
、配列から要素をランダムな方法で繰り返しなしで取得する方法がわかりません。これが私のコードです:

var letters = [ "A", "A", "B", "B", "C", "C", "D", "D", "E", "E",
           "F", "F", "G", "G", "H", "H", "I", "I", "J", "J" ],
cards = document.getElementsByClassName( "cards" ),
cardBoxes = document.getElementsByClassName( "card-boxes" );


//generate random number
function randomNum( nums ) {
 return Math.floor( Math.random() * nums.length );
}


//hide letter behind card in random way
function hideLetter() {
 for ( var i = cards.length - 1; i >= 0; i-- ) { 
   var randomLetter = letters[ randomNum(letters) ];
   cards[i].textContent = randomLetter;
 };
}
hideLetter();

私はランダムな方法で要素を取りますが、Math.random は繰り返されます。要素が2回取得されたかどうかを検出する、何らかのifステートメントを作成する必要があると思いますが、その方法がわかりません。アドバイスを探しています。ありがとう。

ここで問題のCodepen http://codepen.io/Kuzyo/pen/vdlai

4

4 に答える 4

2

確かな方法は、使用後に配列から要素を削除することです。こうすれば二度と繰り返されない

于 2013-07-27T16:31:24.683 に答える
2

配列をランダム化し、ランダム化された配列をウォークスルーします。これには、通常の「ランダムインデックスを使用しながら要素を削除する」という利点がありますが、同じランダムソートに依存する繰り返し操作が必要な場合に備えて、シーケンスを維持します。

function randomize(array) {
  var copy = array.slice(),
      random = [],
      element, pos;
  while(copy.length>0) {
    pos = (Math.random()*copy.length) | 0; // bit operation forces 32-bit int
    subarray = copy.splice(pos, 1);
    random.push(subarray[0]);
  }
  return random;
}

var letters = [ "A", "A", "B", "B", "C", "C", "D", "D", "E", "E",
       "F", "F", "G", "G", "H", "H", "I", "I", "J", "J" ],
    randomLetters = randomize(letters);

randomLetters.forEach(function(letter) {
  // create a card for this letter
});

// do we need it again, in a new random fashion?
// then we can simply call this:
randomLetters = randomize(letters);
于 2013-07-27T16:31:33.183 に答える