2017-07-11 4 views
1

私は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アルゴリズム内の何かが問題を引き起こしていると仮定しています。

+0

「シャッフル」は、新しい配列を作成するのではなく、配列を変更します。あなたはそれをコピーする必要があります。 – Bergi

答えて

1

毎回同じ配列参照をシャフリングし、同じmyInput配列への5つの参照で大きな配列を埋めます。任意の一つの基準に

変更同じ物理的配列に、彼らはすべての点以降のすべてに影響を及ぼします

slice()を使用して各反復コピーを作成しますので、あなたが実際たびに

var myInput = [1, 2, 3, 4, 5]; 
 
var myOutput = []; 
 

 
for (i=0; i<5; i++){ 
 
    var shuffledArr = shuffle(myInput.slice()); 
 
    myOutput.push(shuffledArr); 
 
} 
 

 
console.log(myOutput); 
 

 
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 a = [1,2]; 
b = a; // not a copy of the [1,2] array ... is reference to it 
b[0] = 99; 
console.log(a) // [99,2] ...same as `b` 
+0

私の男!私はそれが事件の一種だと思ったが、slice()の使用については考えなかった。私は関数内で新しい配列変数を追加しようとしたが、新しい配列を返すのは同じことをやってしまった。それはなぜでしょうか? – ewrjontan

+0

多分私の簡単な例で私の答えの最後に説明されています....あなたは "新しい配列"とは思わないが...それはまだ同じ配列への参照です。 – charlietfl

+0

Ahhhは理にかなっています。ありがとう! – ewrjontan

関連する問題