Jak zamíchám znaky v řetězci v JavaScriptu?

Zejména se chci ujistit, že se vyvaruji chyby v náhodném kódu volby prohlížeče společnosti Microsoft. To znamená, že se chci ujistit, že každé písmeno má stejnou pravděpodobnost, že skončí na každé možné pozici.

např. Zadané „ABCDEFG“ vraťte něco jako „GEFBDCA“.

Odpověď

Upravil jsem příklad ze záznamu Fisher-Yates Shuffle na Wikipedii na míchání řetězců:

String.prototype.shuffle = function () {
    var a = this.split(""),
        n = a.length;

    for(var i = n - 1; i > 0; i--) {
        var j = Math.floor(Math.random() * (i + 1));
        var tmp = a[i];
        a[i] = a[j];
        a[j] = tmp;
    }
    return a.join("");
}
console.log("the quick brown fox jumps over the lazy dog".shuffle());
//-> "veolrm  hth  ke opynug tusbxq ocrad ofeizwj"

console.log("the quick brown fox jumps over the lazy dog".shuffle());
//-> "o dt hutpe u iqrxj  yaenbwoolhsvmkcger ozf "

Další informace lze nalézt v odpovědi Jona Skeeta na Je správné používat pro míchání metodu JavaScript Array.sort()?.