Feedback

C# - Zufallszahlen, die sich nicht wiederholen

Veröffentlicht von am 5/13/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.
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 5/13/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!