Windows Azure Cloud Storage ermöglicht es Ihnen bereits ab 0,10€ pro GB/Monat die Vorteile der Cloud zu nutzen.
Willkommen bei dotnet-snippets.de! Snippet hinzufügen Login Registrieren
Snippets in der Datenbank: 1551 | Anzahl registrierter User: 1841 | Besucher online: 0
Hauptmenü
Home
Top Ten
Zufälliger Snippet
FAQs
.NET Community
dotnet-forum.de
dotnet-kicks.de
Social

RSS Feeds
Rss Alle Snippets
Rss C#
Rss VB.NET
Rss C++
Rss ASP.NET
Partner
Member of Microsoft Community Leader/Insider Program (CLIP)

Zufallszahlen, die sich nicht wiederholen


Autor: herbivore
Sprache: C#
Bewertung:
8.38 (3 votes)
Anzahl der Aufrufe: 17421
  
Kick it on dotnet-kicks.de  

Beschreibung:

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.


Abgelegt unter: Random, Zufall, Zufallszahlen, Shuffle, mischen, List, Liste, IList, Swap, Dreieckstausch, Gleichverteilung.



C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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);
}
Sie haben Fragen zu diesem Snippet oder brauchen Hilfe bei der .NET Entwicklung?
Freundliche und kompetente Entwickler helfen Ihnen gern weiter im Forum für .NET Entwicklung.



Kommentare:
(Zum Schreiben von Kommentaren bitte anmelden.)

herbivore schrieb am:  13.05.2007 10:38:02

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


schlecht sehr gut
1 2 3 4 5 6 7 8 9 10
Nur angemeldete User können Snippets bewerten.