Visual Basic - Technik, FAQ, Tricks, Beispiele

Home / Allgemein / Mathe / Rnd

König Zufall

Grundlagen

Zufallszahlen spielen in vielen Bereichen eine wichtige Rolle, z.B. im Entertainment-Bereich (Spiele, Quiz) oder in der Wissenschaft (Simulationen).

VB kennt nur eine Möglichkeit, zufällige Werte zu generieren: Die Rnd-Funktion. Diese Funktion macht nichts anderes, als bei jedem Aufruf eine andere Zahl zwischen "0" (einschließlich) und "1" (ausschließlich) zu liefern. Das scheint auf dem ersten Blick relativ unflexibel zu sein, aber wir werden sehen...

Beispiel: Ein Würfel

In echten Anwendungen wird keine Zahl zwischen "0" und "0,9999999" benötigt, sondern meistens Ganz-Zahlen. Also muss der Zufallszahlenbereich "gestreckt" werden (im Beispiel: Faktor 6), das Resultat abgerundet werden, sowie der kleinstmögliche Wert (im Beispiel: 1) dazuaddiert werden. Der resultierende Code für einen sechsseitigen Würfel sieht also so aus:

Function Würfel6() As Long
  Würfel6 = Int(6 * Rnd) + 1
End Function

Möchte man nun Würfel auch mit anderen Seitenzahlen erzeugen (Rollenspieler kennen u.a. auch 4er oder 20er-Würfel), so ist die Funktion folgendermassen zu verallgemeinern:

Function Würfel(Optional ByVal Seiten As Long = 6) As Long
  Würfel = Int(Seiten * Rnd) + 1
End Function

So kann mit Würfel(20) ein Wurf mit einem zwanzigseitigem Würfel simuliert werden.

Zufällige Zufallszahlen

Schreibt man nun ein Programm und gibt darin ein paar Zufallszahlen aus, so stellt man nach jedem Programmstart erstaunliches fest: Die Zufallszahlen sind jedesmal die gleichen!

Dies liegt daran, dass VB intern eine komplexe mathematische Funktion zur Bestimmung eines Pseudo-Zufallswerts verwendet, welche aus einer vorhandenen (alten) Zufallszahl eine neue berechnet. Bei Programmstart gibt es allerdings noch keine "alte" Zufallszahl, und da wird einfach ein fixer Wert verwendet.

Natürlich wäre es sehr langweilig, wenn z.B. in einem Spiel immer das Selbe passieren würde. Daher kann der Startwert für die Zufallszahlen-Generierung modifiziert werden. Der Befehl dazu lautet Randomize. Durch Ausführung dieses Befehls wird aus dem aktuellen Zeitstempel ein Zufalls-Startwert berechnet. Man sollte diesen Befehl also zu Beginn des Programms einmal ausführen lassen, z.B. in Main oder in Form_Load:

Private Sub Form_Load()
  Randomize
End Sub

Zufallsstrings

Zu Testzwecken (z.B. Füllung einer Datenbank mit vielen Daten) werden oft auch zufällige Zeichenketten benötigt, da man (noch) keine Echtdaten hat (oder keine verwenden darf).

Die folgende Funktion benutzt das bisherige Wissen, um zufällige Strings zu generieren. Optional kann angegeben werden, aus welchen Zeichen sich die Strings zusammensetzen sollen, und wie lang sie mindestens und höchstens sein sollen.

Man beachte, dass der Zufall an zwei verschiedenen Stellen benötigt wird: Einmal zur Festlegung der String-Länge, und dann noch zur wiederholten Auswahl von zufälligen Zeichen...

Function RndString( _
    Optional Chars As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ", _
    Optional MinLen As Long = 1, _
    Optional MaxLen As Long = 20) As String
  Dim CharsLen As Long
  Dim i As Long
  Dim n As Long
  
  'Länge(n) bestimmen:
  CharsLen = Len(Chars)
  n = Int((MaxLen - MinLen + 1) * Rnd) + MinLen
  RndString = Space$(n)
  
  'Zufällige Zeichen einfügen:
  For i = 1 To n
    n = Int(CharsLen * Rnd) + 1
    Mid$(RndString, i) = Mid$(Chars, n, 1)
  Next i
End Function

So ergibt RndString("AB", 1, 1) einen String, der entweder "A" oder "B" lautet. Dagegen erzeugt RndString("x", 1, 100) Strings, die zwischen 1 und 100 Zeichen lang sind und ausschließlich aus "x" bestehen.

© Jost Schwider, 13.07.2001-13.07.2001 - http://vb-tec.de/rnd.htm