2016-10-12 4 views
0

JSに新しく、現在大学で学んでいます。私の現在のJSプロジェクトでは、メモリカードゲームを構築しています。私はカードをランダムにシャッフルする方法を考え始めました.Fisher-Yates Shuffleのアルゴリズムが行っていることに似ています。つまり、this pageの2番目のプログラムです。しかし、私はspliceメソッドの後に[0]が何をするのかを正確に理解していません。それは配列をシフト/コンパクトするのでしょうか?はいの場合、私はそれに関する他の例/文書を見つけることができません。Fisher-Yates Shuffle in Javascript

function shuffle(array) { 
    var copy = [], n = array.length, i; 

    // While there remain elements to shuffle… 
    while (n) { 

    // Pick a remaining element… 
    i = Math.floor(Math.random() * n--); 

    // And move it to the new array. 
    copy.push(array.splice(i, 1)[0]); 
    } 

    return copy; 
} 

答えて

2

array.splice(i, 1)arrayi番目の要素を切り出しと単一値の配列として返す(ちょうどarray.splice(i, 2)ようi番目とi+1番目の要素を切り出しなり、2つの要素の配列としてそれらを返します)。次に、単純なインデックス作成操作である[0]は、その配列から単一の要素を選択します(配列は必要ありません)。この単一要素はcopycopy.pushを使用して加算されます。インデックス操作の

もっと身近な用途:

array = [4, 7, 2, 10]; 
array[0] 
// => 4 
array[1] 
// => 7 

array = [18]; 
array[0] 
// => 18 
+0

ありがとう@Amadan! – Ludo757

+0

だから私はそれにもっと考えました。スプライスの範囲が '(i、1)'なので、配列から一つの要素を取り除くだけで、 '[0]'は冗長であるということです。 – Ludo757

+0

'splice'は配列を返します。 'push'は単一の値を要求します。 1要素配列は、その要素と同じものではありません。それはあなたのミキサーにトマトを入れたメッシュバッグを入れようとするようなものです。「まあ、私はこのソース用にトマトが1つ必要です。バッグには1つのトマトしか残っていないので、なぜですか?それらのプラスチックのメッシュ繊維は噛んだ側に少しあるので、あなたは最初にバッグからトマトを取る必要があります。 – Amadan

0

array.splice()配列を返しますが、シャッフルしているときは、未知の位置からランダムにカードを取り、(1をシャッフル)新しい配列内でそれを載せていきたいと思います。今度は、copy.push(array.splice(i, 1)を使って同様の配列をもう一度追加したくないというのは、返された配列全体をコピー配列に追加し、シャッフルの乱雑さが減り、結果的にあなたのゲームに依存する結果になるからです。配列はちょうど少数のビットを反転させて最後の配列に似ています(〜)。 [0]array.splice(i, 1)に追加すると、時間に返される結果配列全体から1つの要素だけがコピーされることになり、ランダム性が向上します。

+0

@ Cyclotron3x3ありがとう、今や意味をなさない。とても有難い。 – Ludo757

+0

私が得意でないのは、乱数 'i'によって乱数が生成され、スプライスする配列のランダムなインデックスを選択すると、結果は新しい配列' copy'の最後にプッシュされますので、最終的には新しい配列の要素のインデックス全体がランダムになります(各繰り返しは配列の最後に要素をプッシュします)。ここで '[0]'は重複していませんか? – Ludo757