私はFisher-Yatesアルゴリズムを利用して配列の要素をシャッフルしようとしています。私はこの「シャッフル」された配列を別の配列にプッシュしたいと思っています。私の目標は、特定の量のシャッフルされた配列を含む配列を作成することです。例えばFisher-Yatesシャッフルを利用して複製配列をプッシュしましたか?
:
var myInput = [1, 2, 3, 4, 5];
と私は私の出力は、の線に沿って何かになりたい:私は私の機能を実行した後が問題が発生した
myOutput = [[1, 3, 5, 2, 4], [2, 5, 1, 3, 4], [5, 3, 1, 4, 2]];
。私は配列を提供し、同じ配列を、要素を "シャッフル"して出力する必要があります。私はループ内でこの関数を実行しています。ちょうど5回の繰り返しを言いましょう。各繰り返しで、 "シャッフル"された配列が出力配列にプッシュされます。しかし、私の最終的な出力配列は、5つの異なる配列ではなく、同じ "シャッフル"配列の5つで終わります。何らかの理由で、私のループの最後の繰り返しから "シャッフル"された配列で埋められているようです。
function shuffle(array) {
var m = array.length, t, i;
// While there remain elements to shuffle…
while (m) {
// Pick a remaining element…
i = Math.floor(Math.random() * m--);
// And swap it with the current element.
t = array[m];
array[m] = array[i];
array[i] = t;
};
return array;
};
var myInput = [1, 2, 3, 4, 5];
var myOutput = [];
for (i=0; i<5; i++){
var shuffledArr = shuffle(myInput);
console.log(shuffledArr);
myOutput.push(shuffledArr);
}
console.log(myOutput);
私が言ったように、myOutputは、5つの素子アレイとして終わると、各要素が配列私のループの最後の反復からプッシュされる:
はここに私のコードです。このループでは、shuffledArr変数がコンソールに記録されるとき、出力配列にプッシュされているように見えます。
アイデア?私はこれについて超混乱している。私は、fisher-yatesアルゴリズム内の何かが問題を引き起こしていると仮定しています。
「シャッフル」は、新しい配列を作成するのではなく、配列を変更します。あなたはそれをコピーする必要があります。 – Bergi