Visual Basic Forum

Visual Basic Forum
für VB6 und VB.NET Programmierer
 
RegistrierenRegistrieren  LoginLogin

Neues Thema eröffnen   Neue Antwort erstellen    Visual Basic Forum Foren-Übersicht -> [VB.NET] Tutorials
Autor
Nachricht
Marduk
Überflieger
Überflieger

Anmeldedatum: 16.04.2008
Beiträge: 374

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 Very Happy

MfG
Marduk
_________________
 
Bahamut
Poster
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
Ü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"

http://de.wikipedia.org/wiki/The_Art_of_Computer_Programming
http://de.wikipedia.org/wiki/Donald_Ervin_Knuth

Ich werd auch noch mal was zum Thema Verschlüsselung schreiben.
_________________


 
Neues Thema eröffnen   Neue Antwort erstellen    Visual Basic Forum Foren-Übersicht -> [VB.NET] Tutorials

Tags: visual basic, random, zufallszahl, zufallszahlen

 
 Verwandte Themen   Aufrufe   Letzter Beitrag 
Keine neuen Beiträge Wie kann ich mich bei euch anmelden?? 387 20.05.2002, 01:28
Keine neuen Beiträge Eine kleine Frage an euch.. 373 30.09.2007, 09:57
Keine neuen Beiträge TopMost Funktion unter DirectX 432 27.07.2007, 11:48
Keine neuen Beiträge Wie Funktion nutzen ? 540 29.06.2007, 21:59
Keine neuen Beiträge update funktion einbauen 741 29.01.2007, 00:11
 



[ Time: 0.3750s ][ Queries: 89 (0.1326s) ][ GZIP on - Debug on ]