JavaScript: 配列をシャッフルするロジック
配列をシャッフルする方法はいろいろあるようですが、有名なのが
Fisher–Yates Shuffleという方法です。
「配列の末尾から、残りの配列のどれかと値を入れ替える」というロジックです。
「Fisher–Yates Shuffle」を参考に、少しだけ変更して関数を作成しましたので、ご自由に使ってください。
// 配列シャッフル用関数
function shuffle(arr) {
var n = arr.length;
var temp, i;
while (n) {
i = Math.floor(Math.random() * n--);
temp = arr[n];
arr[n] = arr[i];
arr[i] = temp;
}
return arr;
}
実際にシャッフルしてみると
10回実行して、シャッフル具合に偏りがないかを見てみます。
var arr = [];
for (var i = 0; i < 10; i++){
arr = [1,2,3,4,5,6,7,8,9,10];
shuffle(arr);
console.log(arr);
}
結果は次の通り。偏りはないようです。上手くシャッフルされてますね。
Array [ 7, 6, 9, 4, 8, 5, 1, 2, 10, 3 ]
Array [ 2, 7, 5, 9, 10, 3, 6, 4, 8, 1 ]
Array [ 10, 8, 3, 4, 6, 2, 1, 9, 5, 7 ]
Array [ 9, 4, 3, 10, 1, 2, 8, 6, 7, 5 ]
Array [ 10, 1, 8, 5, 6, 4, 9, 7, 2, 3 ]
Array [ 9, 8, 3, 7, 2, 6, 1, 5, 10, 4 ]
Array [ 4, 2, 8, 5, 3, 1, 6, 7, 10, 9 ]
Array [ 6, 3, 8, 5, 10, 7, 1, 9, 2, 4 ]
Array [ 7, 6, 4, 9, 2, 5, 3, 10, 1, 8 ]
Array [ 3, 1, 4, 7, 10, 5, 9, 8, 6, 2 ]