Heim > Backend-Entwicklung > C++ > Ist 'orderBy (x => r.Next ())` eine intelligente Möglichkeit, eine Liste zu mischen?

Ist 'orderBy (x => r.Next ())` eine intelligente Möglichkeit, eine Liste zu mischen?

DDD
Freigeben: 2025-01-31 19:01:08
Original
614 Leute haben es durchsucht

<.> R.Next ()) `Ein Sart -Weg, um eine Liste zu mischen? " /> Is `OrderBy(x =>
</p> <<> Ist die <p> Shuffle -Liste weise? <strong> <<>
<code>OrderBy(x => r.Next())</code> Wenn Sie den Shuffle -Algorithmus diskutieren, empfehlen einige Personen den folgenden Code: </strong>
</p>
<p> <估> Bewertung </p> <div class=

var r = new Random();
var shuffled = ordered.OrderBy(x => r.Next());
Nach dem Login kopieren

Diese Methode ist keine ideale Shuffle -Methode. Obwohl es für jedes Element die einzige Zufallszahl generiert, handelt es sich um eine O (n log n) Operation und es gibt einen effektiveren O (n) -Algorithmus. <原> Arbeitsprinzip

im Wesentlichen wird diese Methode zufällig auf Elemente verteilt und sie basierend auf diesen Zahlen sortiert. Dies stellt sicher, dass jedes Element in verschiedenen Positionen erscheint, der Ort jedoch tatsächlich durch die generierte Zufallszahl bestimmt wird.

<替> Alternative Methode

Es wird empfohlen, den Fisher-Yates-Shuffle-Algorithmus der Durstenfeld-Version zu verwenden, die direkt Elemente austauschen. Kann mit solchen Erweiterungen wie folgt implementiert werden:

<能> Leistungsoptimierung

Um die Leistung weiter zu optimieren, können die Elemente sofort beim Mischen zurückgegeben werden, wodurch unnötige Arbeiten reduziert werden: (Dieser Code ist genau der gleiche wie der vorherige Code, wiederholt)

public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> source, Random rng)
{
    T[] elements = source.ToArray();
    for (int i = elements.Length - 1; i >= 0; i--)
    {
        int swapIndex = rng.Next(i + 1);
        yield return elements[swapIndex];
        elements[swapIndex] = elements[i];
    }
}
Nach dem Login kopieren

<说> Wichtige Beschreibung

muss die richtige zufällige Instanz verwenden, um zu vermeiden, dass die gleiche digitale Sequenz mehrmals generiert wird und die Thread -Sicherheit behält.

">

Das obige ist der detaillierte Inhalt vonIst 'orderBy (x => r.Next ())` eine intelligente Möglichkeit, eine Liste zu mischen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Empfehlungen
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage