Ich nehme gerade Sedgewicks Algorithmen-Kurs auf Coursera (unterrichtet in Java). Er sagt, um einen gleichmäßig zufälligen Shuffling-Algorithmus zu erstellen, muss ich jeden Index i
in meinem Array durchgehen und dieses Element mit einem zufälligen Element AUS NUR DEN ELEMENTEN, die ich SCHON GEDACHT HABE, austauschen. Er sagt, wenn ich das Element mit einem zufälligen Element aus dem gesamten Array austauschen würde, wäre es nicht gleichmäßig zufällig. Warum nicht? Wenn für jede Iteration das Element [I] völlig zufällig mit einem anderen Element im Array ausgetauscht wird, einschließlich sich selbst, dann ist 1/N immer die Wahrscheinlichkeit, wo das Element [I] enden wird; Ich sehe nicht, wie Voreingenommenheit eingeführt wird.Shuffle: Warum ist eine for-Schleife Umschaltung arr [i] mit arr [r] (r: Zufall 0 - Länge - 1) nicht eine gleichmäßig zufällige Shuffle?
Mit anderen Worten: er spricht:
for (var i = 0; i < arr.length; i++){
var r = Math.floor(Math.random() * i + 1)
swap(r, i);
}
über
for (var i = 0; i < arr.length; i++){
var r = Math.floor(Math.random() * arr.length)
swap(r, i);
}
Excuse JavaScript als ich einen brandneuen Programmierer bin und bequemer mit ihm :)
Die Verzerrung kommt von Elementen "0 ... ich" wurde bereits woanders getauscht. Sie müssen berücksichtigen, was die vorherigen Iterationen getan haben, um die Wahrscheinlichkeiten für Speicherorte nach allen Iterationen zu berechnen, anstatt jeden Swap einzeln zu betrachten. – Bergi
Lesen Sie [this] (http://blog.codinghorror.com/the-danger-of-naivete/) für eine sehr schöne Erklärung. – pjs
Wenn Effizienz keine große Rolle spielt, ist ein einfacher Weg, gleichmäßig zu mischen, das Zufügen von Elementen nach dem Zufallsprinzip und das Kopieren derselben in eine neue Liste, wenn und nur wenn sie dort noch nicht kopiert wurden. –