Zufallszahlen mit der Random-Klasse Verfasst am: 05.05.2008, 03:37
Guten Morgen zusammen,
heute möchte ich euch etwas über die Random Funktion in VB.NET erzählen, sprich wir wollen Zufallszahlen erzeugen lassen. Vorteile wie Nachteile werden erklärt. Und eins zwei Beispiele werden auch dabei sein. Also fangen wir gleich an. Der Begriff "zufällig" ist hier nicht komplett richtig, da man in VB an bestimmte Grenzen gebunden ist. So kann VB nur auf eine endliche Menge an Zahlen zurückgreifen. Und zur Erzeugung der Zahlen wird ein mathematischer Algorithmus verwendet, der ebenso wie die Zahlenmenge endlich ist. Das braucht uns aber nicht zu interessieren, da uns das bei unseren Projekten nicht auffallen wird. Zur Erzeugung der Zufallszahlen wird ein sog. Seed-Wert benötigt. Dieser wird bei der Initialisierung der Klasse als Parameter übergeben. Standardmäßig wird dazu die aktuelle Systemzeit genommen, oder der Programmierer kann den Seed-Wert manuell als Int32 Wert übergeben. Dann wollen wir uns mal ein paar Zahlen erzeugen lassen. Dazu brauchen wir, wie erwähnt, die Random-Klasse. Als erstes testen wir die parameterlose Variante, bei der die Systemzeit als Seed verwendet wird.
Visual Basic: [code]Private Sub generate_int() 'wird bei _Load aufgerufen Dim iRnd As New Random
For i As Integer = 0 To 9 Debug.Print(Str(iRnd.Next(1, 10))) Next End Sub[/code]
Mit Hilfe der iRnd Variable initialisieren wir uns die Random-Klasse. Innerhalb der Schleife erzeugen wir mit iRnd.Next(1,10) unsere Zufallszahl, die zwischen 1 und 10 liegen soll. Die Next-Methode kann zwei Parameter besitzen, einen Minimum- und/oder einen Maximum-Wert. Mit Str() konvertieren wir den Int-Wert in einen String um, ist bei VB nicht so wichtig, aber bei C# umsomehr (nur so am Rande). Mit Debug.Print geben wir dann im Debugmodus das Ergebnis in der Ausgabe der IDE aus (nur zum Test). Wenn wir das jetzt debuggen sollten wir unsere ersten zufällig erstellten Zahlen haben. Hier mal meine:
3 5 1 7 8 2 7 9 2 3
Das könnt ihr jetzt ein paar mal machen und ihr werdet immer andere Zahlen (Reihenfoge ist zu beachten) bekommen. Als nächstes testen wir mal die Variante, bei der wir den Seed-Wert angeben können.
Visual Basic: [code]Private Sub generate_int() Dim iRnd As New Random(2)
For i As Integer = 0 To 9 Debug.Print(Str(iRnd.Next(1, 10))) Next End Sub[/code]
Jezt haben wir die 2 als Parameter/Seed übergeben. Jetzt testen wir das ganze und bekommen folgendes Ergebnis:
7 4 2 9 1 3 8 5 3 1
Wenn ihr das ganze ein paar mal wiederholt, werdet ihr merken, dass immer die selben Zahlen "zufällig" erzeugt werden. Das hängt mit dem Seed-Wert und dem verwendeten Algorithmus zusammen, der bei gleichem Seed immer die selbe Reihenfolge erzeugt. Jezt werdet ihr euch sicherlich fragen für was man das gebrauchen kann, wenn immer die selben Zahlen kommen. Für die normalen Zufallsdinge, wie z.B. Würfeln ist das natürlich nicht zu gebrauchen. Denkt man aber Verschlüsselungen, so wird man einige Vorteile erkennen können.
Wollen wir jetzt aber eine Zahlenfolge erstellen, bei der jede Zahl nur einmal vorkommt (z.B. Lotto), so kann uns folgender Code helfen.
Visual Basic: [code]Private Sub generate_int(ByVal iCount As Integer) Dim rRnd As New Random 'ohne Seed, sonst kommen immer die gleichen Zahlen Dim i, j, iT, iRand(iCount) As Integer 'für Schleifen, und unser Zahlenarray Dim bFound As Boolean 'Status
For i = 0 To iCount Do iT = rRnd.Next(1, 11) bFound = False For j = 0 To iCount If iRand(j) = iT Then bFound = True Exit For End If Next Loop Until bFound = False iRand(i) = iT Next
'Ausgeben For s As Integer = 0 To iCount Debug.Print(iRand(s)) Next End Sub[/code]
Zuerst generieren wir uns eine Zufallszahl und speichern sie im Array. Im nächsten Durchgang wird eine neue Zahl erzeugt und mit den vorhandenen im Array verglichen. Falls schon die gleiche im Array ist, wird eine neue Zahl erzeugt und diese wieder verglichen, bis sie "einzigartig" im Array ist. Anschließend wird der nächste Durchgang gestartet. Was vielleicht noch zu erwähnen wäre:
Falls man mehrere Zufallszahlen für verschiedene Dinge in einem Programm benötigt, sollte man diese nicht mit mehreren Variablen erzeugen, und vorallem nicht direkt hintereinander, da der Seed standardmäßig der Uhrzeit ist. Und bei schnellen Rechnern kann es sein, dass innerhalb eines Zeittaktes zwei Random-Variablen initialisiert wurden, d.h man bekommt zwei gleiche Zahlenfolgen. Deswegen sollte man immer auf eine Verwendung achten.
So soviel zum Thema Zufallszahlen und von mir. Ich hoffe ihr konntet was lernen und würde mich über Feedback freuen. Dann gibts mehr Tuts
MfG Marduk _________________
Bahamut Poster
Anmeldedatum: 17.04.2008 Beiträge: 142
Verfasst am: 05.05.2008, 11:08
Also das mit dem Seed und Verschlüsselungen klingt interessant, kannst da vll noch ein bisschen mehr drüber schreiben? Eine Verwendung als Hash ist klar, aber als Verschlüsselung..
Außerdem würd mich der Name des Algorithmus interessieren ^^
Marduk Überflieger
Anmeldedatum: 16.04.2008 Beiträge: 374
Verfasst am: 05.05.2008, 16:55
Den genauen Namen des Algos hab ich nicht gefunden, er wurde aber von Donald E. Knuths entwickelt. Recht "berühmter" Informatiker. Hat auch eine Buchreihe veröffentlich über allerlei Themen "The Art of Computer Programming"