Heim >Backend-Entwicklung >C++ >Wie kann ich zufällig eine generische Liste in C# effizient und sicher mischen?
Fisher-yates Shuffle Expansion Methode
, indem die Elemente mit zufälligen Indizes wiederholt werden. Der folgende Codeblock zeigt eine Erweiterungsmethode zur Implementierung des Fisher-Yates-Algorithmus:
<code class="language-csharp">private static Random rng = new Random(); 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>Um diese Erweiterungsmethode zu verwenden, rufen Sie einfach den Shuffle () für ilist
auf. Zum Beispiel:
<code class="language-csharp">List<Product> products = GetProducts(); products.Shuffle();</code>system.security.cryptographie verwenden, um die Zufälligkeit zu verbessern
<code class="language-csharp">using System.Security.Cryptography; ... public static void Shuffle<T>(this IList<T> list) { using (RNGCryptoServiceProvider provider = new RNGCryptoServiceProvider()) { int n = list.Count; while (n > 1) { byte[] box = new byte[1]; do provider.GetBytes(box); while (!(box[0] < (byte)((double)uint.MaxValue / uint.MaxValue * n))); int k = (int)(box[0] % n); T value = list[k]; list[k] = list[n - 1]; list[n - 1] = value; } } }</code>Die Bedeutung von Leistungsüberlegungen und Thread -Sicherheit
Schlussfolgerung
Das obige ist der detaillierte Inhalt vonWie kann ich zufällig eine generische Liste in C# effizient und sicher mischen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!