Eine C# -Liste randomisieren
In diesem Artikel werden effiziente Methoden zum Verschmieren der Elemente einer generischen Liste (Liste
Der Fisher-yates Shuffle-Algorithmus
Der Fisher-Yates-Shuffle ist ein bewährter Algorithmus zur Randomisierungslistenreihenfolge. Es wird hier als prägnante Erweiterungsmethode für jeden ilist
<code class="language-csharp">public static void Shuffle<T>(this IList<T> list) { int n = list.Count; while (n > 1) { n--; int k = rng.Next(n + 1); T value = list[k]; list[k] = list[n]; list[n] = value; } }</code>
hier ist rng
eine Instanz der Random
Klasse.
Optionen für Zufallszahlengenerierungsoptionen
Die Standard System.Random
-Klasse reicht für viele Anwendungen aus. In Situationen, in denen eine höhere kryptografische Sicherheit und eine verbesserte Zufälligkeit erforderlich ist, sollten Sie den System.Security.Cryptography
Namespace verwenden:
<code class="language-csharp">public static void Shuffle<T>(this IList<T> list) { using (var provider = new RNGCryptoServiceProvider()) { int n = list.Count; while (n > 1) { byte[] box = new byte[1]; do provider.GetBytes(box); while (!(box[0] < (byte)((n + 1) * (double.MaxValue / 256)))); //Ensure value within range int k = box[0] % (n + 1); T value = list[k]; list[k] = list[n]; list[n] = value; } } }</code>
Diese Version verwendet RNGCryptoServiceProvider
für eine verbesserte Zufälligkeit. Beachten Sie die hinzugefügte Prüfung, um sicherzustellen, dass die generierte Zufallszahl innerhalb des erforderlichen Bereichs liegt.
Verwendungsbeispiel
Beide Methoden werden identisch verwendet:
<code class="language-csharp">List<Product> products = GetProducts(); products.Shuffle(); </code>
Leistungsüberlegungen
Während System.Random
Geschwindigkeit bietet, bietet System.Security.Cryptography
auf Kosten der Leistung überlegene Zufälligkeit. Wählen Sie die entsprechende Methode basierend auf den Anforderungen Ihrer Anwendung aus. Für die meisten allgemeinen Mischung ist System.Random
perfekt ausreichend.
Das obige ist der detaillierte Inhalt vonWie kann ich zufällig eine Liste in C#mischen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!