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 ]