In vielen theoretischen Untersuchungen werden Zustände, Zustandsänderungen oder Werte definierter Prozessgrößen wie zum Beispiel bei Untersuchungen zu Warteschlangen simuliert. Benötigt werden für diese Simulationen zufällige Ereignisse, die mit Zufallszahlen in ausgewählten Intervallen realisiert werden, welche mit Zufallsgeneratoren erzeugt werden. In den mitgelieferten Beispielen zu Gambas befindet sich das Projekt Datenbank/Database, in dem mit mehreren Tausend Zufallsdaten gearbeitet wird.
Ein Zufallsgenerator liefert keine reellen Zahlen, die chaotisch verteilt sind, sondern Zahlen, die nach einem bestimmten Algorithmus berechnet werden. Das bedeutet aber auch, dass solche Generatoren einerseits Startwerte benötigen und andererseits nur reelle Pseudo-Zufallszahlen generieren.
Syntax: RANDOMIZE [ Seed AS Integer ] mit Seed als optionalem Parameter
Der Zufallsgenerators kann mit einem frei wählbaren ganzzahligen Startwert initialisiert werden, wenn beim Aufruf von Randomize der optionale Parameter auf einen festen Integer-Wert gesetzt wird. Folgende Ansätze können genutzt werden:
Nutzen Sie den optionalen Parameter nicht, dann wird für Seed der Zeitstempel gesetzt, sonst wird der ganzzahlige Wert von Seed genutzt.
Auch in Gambas können Sie einen Zufallsgenerator nutzen, der Ihnen in der Standardkonfiguration Zufallszahlen im Bereich 0 Zufallszahl < 1 liefert, wobei die Initialisierung durch den aktuellen Zeitstempel erfolgt.
DIM fZufallszahl As Float DIM iObergrenze, iUntergrenze As Integer Randomize fZufallszahl = Int(Rnd(iUntergrenze, iObergrenze + 1))
Die folgenden Beispiele demonstrieren den Einsatz der 2 Zufallszahl-Funktionen in unterschiedlichen Einsatzfällen.
Beispiel 1
Im ersten Beispiel werden Zufallszahlen mit den Zufallszahl-Funktionen Rnd und Randomize erzeugt. Es wird die Wirkung der Festlegung eines Startwertes demonstriert. Der Quelltext ist kurz und wird deshalb vollständig angegeben:
[1] ' Gambas class file [2] [3] Public Sub Form_Open() [4] FMain.Center [5] FMain.Resizable = False [6] End ' Form_Open() [7] [8] Public Sub btnRnd1_Click() [9] Dim fZufallszahl As Float [10] Dim iCount As Integer [11] [12] TextArea1.Clear [13] Randomize ' optional, weil Standard [14] For iCount = 1 To 10 [15] If iCount < 10 Then [16] TextArea1.Insert(iCount & gb.Tab & Rnd() & gb.NewLine) [17] Else [18] TextArea1.Insert(iCount & gb.Tab & Rnd()) [19] Endif [20] Next ' iCount [21] End ' Rnd1 [22] [23] Public Sub btnRnd2_Click() [24] Dim fZufallszahl As Float [25] Dim iCount As Integer [26] [27] TextArea1.Clear [28] For iCount = 1 To 10 [29] Randomize [30] If iCount < 10 Then [31] TextArea1.Insert(iCount & gb.Tab & Rnd() & gb.NewLine) [32] Else [33] TextArea1.Insert(iCount & gb.Tab & Rnd()) [34] Endif [35] Next ' iCount [36] End ' Rnd2 [37] [38] Public Sub btnRnd3_Click() [39] Dim fZufallszahl As Float [40] Dim iCount As Integer [41] [42] TextArea1.Clear [43] Randomize -2 [44] For iCount = 1 To 10 [45] If iCount < 10 Then [46] TextArea1.Insert(iCount & gb.Tab & Rnd() & gb.NewLine) [47] Else [48] TextArea1.Insert(iCount & gb.Tab & Rnd()) [49] Endif [50] Next ' iCount [51] End ' Rnd3 [52] [53] Public Sub btnClose_Click() [54] FMain.Close [55] End ' Close
Abbildung 9.5.3.1: Liste mit 10 unterschiedlichen Zufallszahlen
Ergebnisse:
Die Prozedur in den Zeilen 8-22 liefert stets eine Liste mit 10 unterschiedlichen Zufallszahlen. Die zweite Prozedur in 23-36 liefert nur Zufallszahlen, die Serien gleicher Zahlen enthalten kann – im Extremfall sind alle Zufallszahlen gleich. Der Grund liegt darin, dass der Zufallsgenerator für eine Sekunde den gleichen Startwert hat. Die Zufallszahlen in der 3. Prozedur in 41-58 sind zwar unterschiedlich, jedoch ist die Liste der erzeugten Zufallszahlen stets gleich, weil immer der gleiche Startwert für den Zufallsgenerator gesetzt wird.
Beispiel 2
Für Testzwecke benötigt man oft Zufallsdaten, die nicht notwendigerweise Zahlen sein müssen. Im zweiten Beispiel werden für den Test zur Sortierung von Daten in einer GridView Zufallsdaten vom Datentyp Boolean, Float, Integer, String und Date benötigt.
In den folgenden Zeilen wird nur die Prozedur zur Generierung der Zufallsdaten vorgestellt:
Private hSort As New CSort Private iCount As Integer Public Sub btnFillGrid_Click() Dim i As Integer Dim vMatrix As Variant[] Dim aStrs As String[] = ["Merkur","Venus","Erde","Mars","Jupiter","Saturn","Uranus","Neptun","Pluto"] Randomize For i = 0 To iCount Step 1 vMatrix = New Variant[] vMatrix.Add(Round(Rnd(0, 10), -2)) ' Reelle Zahl vMatrix.Add(CBool(Round(Rnd(0, 1)))) ' Wahrheitswert vMatrix.Add(aStrs[CInt(Rnd(0, aStrs.Count))]) ' Zeichenkette vMatrix.Add(CDate(Rnd(CFloat(Now()), CFloat(Now() + 1000)))) ' Datum 1 vMatrix.Add(CInt(Rnd(-10, 10))) ' Ganze Zahl vMatrix.Add(CDate(Rnd(CFloat(Now()), CFloat(Now() + 2000)))) ' Datum 2 hSort.Add(vMatrix) Next ' i ArrayToGrid() End ' FillGrid
Abbildung 9.5.3.2: GridView mit zufällig erzeugten Datensätzen, sortiert nach der 1. Spalte
Die vollständigen Projekte für die ersten beiden Beispiele werden im Download-Bereich zur Verfügung gestellt.
Beispiel 3
Unter http://de.wikibooks.org/wiki/Gambas:_Zufall#Zufallsquadrate finden Sie ein kleines Projekt, bei dem sowohl die Koordinaten der zu zeichnenden Quadrate als auch deren Farbe zufällig berechnet werden.