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 ]

JavaScript入門