Heim > Backend-Entwicklung > C++ > Wie kann ich zufällig eine generische Liste in C# effizient und sicher mischen?

Wie kann ich zufällig eine generische Liste in C# effizient und sicher mischen?

Mary-Kate Olsen
Freigeben: 2025-02-03 07:50:11
Original
233 Leute haben es durchsucht

How Can I Randomly Shuffle a Generic List in C# Efficiently and Safely?

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!

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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage