Feedback

C# - Zufallszahlen, die sich nicht wiederholen

Veröffentlicht von am 13.05.2007
(3 Bewertungen)
Eine einfache, schnelle und zuverlässige Methode, um Zufallszahlen zu erzeugen, die sich nicht wiederholen, ist eine Liste mit den Ausgangszahlen zufällig zu mischen und anschließend diese Liste sequentiell durchzugehen.

Wenn man z.B. Zufallszahlen zwischen 0-9 ohne Wiederholung haben möchte, erzeugt man die Liste (0,1,2,3,4,5,6,7,8,9) und kann durch Mischen daraus z.B. (5,3,6,2,4,9,1,7,0,8) machen. Dies Mischen erledigt die unten implementierte Methode Shuffle.

Um die exakte Gleichverteilung aller möglichen Mischergebnisse zu erreichen, muss die Methode genau wie unten implementiert sein. Schon kleine Änderungen (z.B. ein Schleifendurchlauf mehr oder weniger) können die Gleichverteilung zerstören.

Die Shuffle-Methode basiert auf dem Algorithmus von D. E. Knuth, The Art of Computer Programming. Volume 2: Seminumerical Algorithms, second edition. Addison-Wesley, 1981.

Die Shuffle-Methode ließe sich natürlich leicht so abändern, dass nicht die übergebene Liste gemischt wird, sondern diese unverändert bleibt und eine Kopie der Liste gemischt und zurückgegeben wird.
GFU-Schulungen  [Anzeige]

Visual Studio Team Foundation Server 2017/2015 (TFS) für Projektmitglieder - Kompakt

Nach Teilnahme an dieser Schulung sind Ihnen die Grundlagen von ALM geläufig. Sie planen und steuern Projekte effizient mit dem Visual Studio Team Foundation Server.

Visual Studio Team Foundation Server 2017/2015 (TFS) für Entwickler - Kompakt

Nach Teilnahme an dieser Schulung kennen Sie alle wesentlichen Funktionen des TFS für Entwickler. Sie setzen Software-Entwicklung mit dem Visual Studio Team Foundation Server erfolgreich um.

private static Random rand = new Random ();

public static void Shuffle<T> (IList<T> ilist)
{
    int iIndex;
    T   tTmp;
    for (int i = 1; i < ilist.Count; ++i) {
       iIndex = rand.Next (i + 1);
       tTmp = ilist [i];
       ilist [i] = ilist [iIndex];
       ilist [iIndex] = tTmp;
    }
}

// Und hier noch ein kleines Beispiel für die Verwendung:
List<int> list = new List <int> ();

for (int i = 0; i < 10; ++i) {
   list.Add (i);
}

Shuffle<int> (list);

foreach (int i in list) {
   Console.WriteLine (i);
}

1 Kommentare zum Snippet

herbivore schrieb am 13.05.2007:
Eine Diskussion zu dem Thema "Zufallszahlen, die sich nicht wiederholen" findet sich unter http://www.mycsharp.de/wbb2/thread.php?threadid=4299
 

Logge dich ein, um hier zu kommentieren!