JavaScript - 配列をランダムソート(シャッフル)する
JavaScript で配列をランダムソート(シャッフル)する方法を紹介します。
配列をランダムソート(シャッフル)する方法はいくつかあります。
その中でも、データの偏りが少ない方法として Fisher–Yates Shuffle というのが有名です。
簡単に言うと「配列の末尾要素から、前にある要素のどれかと入れ替える」という方法です。
この「Fisher–Yates Shuffle」を参考にして JavaScriipt 用のランダムソート(シャッフル)関数を作ってみました。
ランダムソート(シャッフル)関数
ランダムソート(シャッフル)用関数のサンプルコードです。
// 配列ランダムソート(シャッフル)関数
function shuffleArray(arr) {
var n = arr.length;
var temp = 0, i = 0;
while (n) {
i = Math.floor(Math.random() * n--);
temp = arr[n];
arr[n] = arr[i];
arr[i] = temp;
}
return arr;
}
実際にランダムソート(シャッフル)してみる
上の関数を使って、実際にランダムソート(シャッフル)してみます。
var arr1 = [];
for (var i = 0; i < 20; i++){
arr1 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
shuffleArray(arr1);
console.log(arr1);
}
20回実行した結果は次の通りです。
特に偏りはないようです。
Array [ 9, 1, 3, 0, 2, 8, 4, 6, 7, 5 ]
Array [ 4, 7, 2, 0, 8, 9, 1, 6, 3, 5 ]
Array [ 2, 0, 4, 6, 3, 8, 9, 5, 7, 1 ]
Array [ 5, 4, 9, 2, 0, 8, 6, 1, 3, 7 ]
Array [ 2, 7, 3, 1, 5, 6, 9, 0, 4, 8 ]
Array [ 7, 5, 6, 4, 3, 9, 1, 0, 2, 8 ]
Array [ 6, 2, 4, 1, 8, 9, 0, 3, 7, 5 ]
Array [ 8, 2, 7, 0, 4, 5, 9, 1, 6, 3 ]
Array [ 6, 0, 3, 7, 4, 5, 2, 8, 1, 9 ]
Array [ 7, 6, 3, 4, 5, 9, 1, 0, 8, 2 ]
Array [ 8, 5, 4, 2, 6, 0, 1, 9, 3, 7 ]
Array [ 5, 9, 0, 7, 4, 6, 2, 1, 3, 8 ]
Array [ 4, 9, 3, 0, 6, 2, 5, 1, 8, 7 ]
Array [ 8, 4, 2, 6, 3, 1, 7, 9, 5, 0 ]
Array [ 3, 6, 1, 0, 4, 2, 9, 7, 8, 5 ]
Array [ 2, 8, 3, 0, 5, 6, 1, 4, 7, 9 ]
Array [ 3, 4, 1, 7, 2, 6, 5, 9, 8, 0 ]
Array [ 8, 6, 3, 4, 0, 2, 1, 9, 7, 5 ]
Array [ 2, 1, 9, 7, 5, 0, 3, 4, 8, 6 ]
Array [ 1, 9, 0, 4, 6, 3, 8, 7, 2, 5 ]