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
Mary-Kate OlsenOriginal
2025-02-03 07:50:11186Durchsuche

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:

<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

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:

<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

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!

Stellungnahme:
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