Es gibt einige bestehende Threads über Shuffle JS-Arrays, aber sie scheinen alle nicht trivial und nicht elegant, bestehend aus vielen Zeilen Code.Shuffling Javascript Array elegant
ich einige Blog gestoßen, die die folgende Zeile ein „Abhilfe“ schlägt vor:
yourArray.sort(function() { return 0.5 - Math.random() });
Wenn Sie, sind nicht vertraut mit, wie Sortieralgorithmen arbeiten werde ich hier kurz erklären, dass es immer um den Vergleich von zwei Werten ist des Arrays und dann eine Entscheidung treffen. Die vorgeschlagene Lösung "überschreibt" die Standardvergleichsfunktion mit einer anderen Funktion, die für jeden Vergleich von zwei Zellen einen zufälligen Wert erzeugt (bei jedem Vergleich wird nach dem Zufallsprinzip entschieden, welcher größer als der ist).
Das Problem damit ist, dass ich nicht wissen kann, welcher Sortieralgorithmus von jedem Webbrowser verwendet wird. Für einige Sortieralgorithmen, z.B. BubbleSort, eine solche Funktion wird wahrscheinlich dazu führen, dass der Sortieralgorithmus für immer ausgeführt wird, da es 1/2^(Länge) Wahrscheinlichkeit haben, einen Lauf ohne Swap zu haben. Es scheint auch für Quicksort problematisch zu sein. Ich denke, es regelmäßig nur zu beenden, wenn der Web-Browser MergeSort oder HeapSort
Hat jemand versuchen, es benutzt und kann sagen, ob es sicher ist oder auf eine andere Lösung empfehlen?
Der gleiche Fisher-Yates Shuffle-Algorithmus mit ES6 ist viel langsamer:/ – BrunoLM
Ja, sowohl 1 als auch 3 sind Fisher-Yates. Version 3 ist wahrscheinlich langsamer wegen der strukturierten Zuweisung (die ich vermute, ist in den meisten Browsern nicht gut optimiert). Ich bin überrascht, wie schlecht der Lodash Shuffle im Vergleich zu einer handcodierten Schleife funktioniert. Könnte das an einer fehlenden Aufwärmschleife in Ihrem Test liegen? –