Die zufällige Sortierung der generischen Liste der Generika
zufällige Sortierung generischer Listen (z. B. digitale Listen) ist eine gemeinsame Aufgabe bei der Programmierung. In C#gibt es mehrere Methoden, mit denen die bebaute Methode, die Erweiterungsmethode und sogar die dritte Bibliotheken verwendet werden können, um diesen Zweck zu erreichen. Das Verständnis der besten Methoden und Einschränkungen ist wichtig, um die beste Leistung und Korrektheit zu erzielen.
Fisher-yates Shuffle Expansion Methode
Eine der am häufigsten verwendeten Methoden ist die Verwendung von Fisher-Yates zum Shuffle-Algorithmus. Diese Methode stört zufällig das Element von ilist
, indem die Elemente mit zufälligen Indizes wiederholt werden. Der folgende Codeblock zeigt eine Erweiterungsmethode zur Implementierung des Fisher-Yates-Algorithmus:
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;
}
}
Nach dem Login kopieren
Um diese Erweiterungsmethode zu verwenden, rufen Sie einfach den Shuffle () für ilist
auf. Zum Beispiel:
List<Product> products = GetProducts();
products.Shuffle();
Nach dem Login kopieren
system.security.cryptographie verwenden, um die Zufälligkeit zu verbessern
Obwohl System.Random bequem ist, bietet es nicht immer genügend Zufälligkeit. Wenn Sie eine höhere Zufälligkeit benötigen, bietet System.security.Cryptography Library einen sichereren Zufallszahlengenerator:
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;
}
}
}
Nach dem Login kopieren
Die Bedeutung von Leistungsüberlegungen und Thread -Sicherheit
Das im erste Beispiel verwendete System.Random -Klasse ist kein Thread -Safe. Dies bedeutet, dass wenn mehrere Threads versuchen, gleichzeitig auf dasselbe System zuzugreifen. Um dieses Problem zu lösen, bietet die Threadsafrandom -Klasse eine Thread -Sicherheitslösung mithilfe eines lokalen Zufallszahlengenerators. Die modifizierte Shuffle () Expansionsmethode des Threadsaferantoms, um die Richtigkeit in der Umgebung mit mehreren Threads zu gewährleisten.
Schlussfolgerung
In zufälligen generischen Listen können Entwickler die Verwendung von System.Random (aus Gründen der Bequemlichkeit) oder des Systems wählen. Darüber hinaus hilft die Threadsaferandom -Klasse, dass die Sicherheit der Thread in mehreren Thread -Anwendungen sicherstellt. Die spezifische Methode hängt von den erforderlichen Zufälligkeit und Leistungsüberlegungen ab.
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!