Verwenden Sie OrderBy(x => r.Next())
für die List -Mischung: effektiv oder nicht?
Einige Programmierer verwenden OrderBy(x => r.Next())
, um eine Liste zu mischen, aber ist dies der beste Ansatz? Lassen Sie uns seine Mechanik und Effizienz untersuchen.
wie es funktioniert
Diese Methode weist jedem Element in der Liste eine zufällige Nummer zu und sortiert dann die Liste basierend auf diesen Zufallsnummern. Dies legt die Liste nach dem Zufallsprinzip weiter.
Leistungsprobleme
Der Hauptnachteil ist die Leistung. Die OrderBy
-Methode hat eine zeitliche Komplexität von O (N log n), wodurch es deutlich langsamer ist als andere O (N) -Aldelithmen für größere Listen.
Eine bessere Lösung: Der Fisher-yates Shuffle
Eine weitaus effizientere Alternative ist das Fisher-Yates-Shuffle (insbesondere die Durstenfeld-Variante), die einen Tauschalgorithmus verwendet. Dieses Beispiel zeigt eine wiederverwendbare Shuffle
-Methode unter Verwendung dieses Ansatzes:
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]; } }
Diese verbesserte Version ergibt Elemente, während sie mischt und die Speicherverwendung und -verarbeitung optimiert.
Wichtige Hinweise zu Random
Denken Sie an diese Punkte, wenn Sie mit der Random
-Klasse arbeiten:
Random
-Anstanzen in schneller Folge kann zu ähnlichen Zufallszahlensequenzen führen. Random
Klasse ist nicht mit Thread-Safe. finden Sie im verknüpften Artikel, um Best Practices bei der Verwendung der Random
-Klasse zu verwenden, um diese Fallstricke zu vermeiden.
Das obige ist der detaillierte Inhalt vonIst 'orderBy (x => r.Next ())` eine effektive Möglichkeit, eine Liste zu mischen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!