Gambas: Zufall
Zurück zu Gambas
Zufallsberechnungen mit der Randomfunktion
[Bearbeiten]Für die Berechnung von Zufallszahlen ( bzw Pseudozufallszahlen) brauchen Sie die Befehle Randomize(), RND und INT
Siehe auch http://www.madeasy.de/7/prgmini.htm#z
Achtung: Randomize() ist in neueren Versionen durch RANDOMIZE zu ersetzen.
Münzwurf
[Bearbeiten]Münze ganz oft, 01 Zufallsfolge
[Bearbeiten]Wenn Sie eine längere Zufallsfolge aus O und 1 haben wollen, können Sie dies mit folgendem Programm erreichen. Wie mit einer Münze, die man immer wieder wirft, wird eine Folge Zufallszahlen zwischen 0 und 1 erzeugt. Sie brauchen eine Textarea und einen Befehlsbutton um das Programm in Gang zu bringen. Der Quelltext hinter dem Befehlsfeld lautet:
PUBLIC SUB Button1_Click() 'mehrfacher Muenzwurf zur Erzeugung einer Zufallsfolge von 0 und 1 DIM a AS Integer DIM t AS String DIM M AS Integer Randomize() FOR a = 1 TO 20000 M = Int(2 * Rnd) ' Erzeugt einen Wurf zwischen 0 und 1 t = t & LTrim$(Str$(M)) NEXT Textarea1.Text = t END
Würfeln bis 6
[Bearbeiten]Diese Programm erzeugt wie ein Würfel Zufallszahlen zwischen 1 und 6. Das Ergebnis wird in einer Textbox ausgegeben. Sie brauchen einen Commandbutton, ein Textlabelfeld und einen Textbox, um das Programm in Gang zu bringen.
Siehe auch: Bild
Der Quelltext hinter dem Befehlsfeld Würfeln lautet:
PUBLIC SUB Button1_Click() DIM Wuerfel AS Integer Randomize() Wuerfel = Int(Rnd(1,7)) ' Erzeugt einen Wurf zwischen 1 und 6 TextLabel1.Text = "Sie würfelten eine " TextBox1.Text = Wuerfel END
Folgende Befehle wurden verwendet:
Randomize: Initialisiert den Zufallszahlengenerator.
Anmerkungen: Das Zahl-Argument kann ein beliebiger zulässiger numerischer Ausdruck sein. Durch Zahl wird der Zufallszahlengenerator initialisiert, indem ihm ein neuer Startwert zugewiesen wird. Wenn Sie Zahl weglassen, wird als neuer Startwert der von der Timer-Funktion ausgegebene Wert verwendet. Somit ist der Befehl Randomize Timer eigentlich redundant.
Wird Randomize nicht verwendet, dann liefert die Rnd-Funktion bei jeder Ausführung des Programms dieselbe Zufallszahlenfolge. Soll sich die Zufallszahlenfolge bei jeder Ausführung des Programms ändern, dann setzen Sie eine Randomize-Anweisung ohne Argument an den Anfang des Programms.
Rnd Liefert eine Zufallszahl.
Rnd ( [ Min [ , Max ] )
Berechnet eine Pseudozufallszahl mit dem Lehmer Algorithmus.
Wenn keine Parameter angegeben werden, dann wird eine Zufallszahl im Intervall [ 0 , 1 [ zwischen Null und Eins erzeugt.
Wenn der erste Parameter ( = Min ) angegeben wird, dann wird eine Zufallszahl im Intervall [ 0 , Min [ zwischen Null und dem Parameter erzeugt.
Wenn man die beiden Parameter angibt, dann wird eine Zufallszahl im Intervall [ Min , Max [ erzeugt.
Beispiel:
PRINT Rnd
=> 0.019539254718
PRINT Rnd(2)
=> 0.040205506608
PRINT Rnd(Pi, Pi(2))
=> 3.204108046818
Int
Value = Int ( Zahl )
Schneidet die Stellen nach dem Komma weg und gibt nur die Zahlen vor dem Komma aus. Anders erklärt: Gibt den Zahlenwert vor dem Komma zurück, d.h es wird die ganze Zahl ausgegeben, die kleiner als ursprüngliche Zahl ist .
Beispiel:
PRINT Int(Pi)
=> 3
PRINT Int(-Pi)
=> -4
6er Würfel überprüfen
[Bearbeiten]Im folgenden wird ein Programm aufgelistet , welches die Randomfunktion an Hand eines Würfels überprüft. Es funktioniert direkt im Terminalmodus von Gambas. Man braucht also keine Form.
' Gambas class file STATIC PUBLIC SUB Main() DIM x AS Integer DIM w AS Integer DIM a AS Integer DIM b AS Integer DIM c AS Integer DIM d AS Integer DIM e AS Integer DIM f AS Integer Randomize() FOR x = 1 TO 1000000 'w = Int(Rnd(6) + 1) identisch zur nächsten Zeile w = Int(Rnd(1,7)) SELECT CASE w CASE 1 a = a + 1 CASE 2 b = b + 1 CASE 3 c = c + 1 CASE 4 d = d + 1 CASE 5 e = e + 1 CASE 6 f = f + 1 END SELECT NEXT PRINT a, b, c, d, e, f END
Würfeln bis 12
[Bearbeiten]Man braucht eine Textbox , ein Textlabelfeld und einen Commandbutton, um das Programm zu starten. Das Problem ist analog dem 6er Würfel einfach zu lösen :
PUBLIC SUB Button1_Click() Wuerfel AS Integer Randomize() Wuerfel = Int(Rnd(1,13)) ' Erzeugt einen Wurf zwischen 1 und 12 TextLabel1.Text = "Sie würfelten eine " TextBox1.Text = Wuerfel END
Im Terminalmodus ist es kürzer:
STATIC PUBLIC SUB Main() Wuerfel AS Integer Randomize() Wuerfel = Int(Rnd(1,13)) ' Erzeugt einen Wurf zwischen 1 und 12 PRINT wuerfel END
Oder noch kürzer:
STATIC PUBLIC SUB Main() Randomize() PRINT Int(Rnd(1,13)) END
Lotto
[Bearbeiten]Dieses schon etwas kompliziertere Programm zieht aus den Zahlen 1 bis 49 zufällig sechs Lottozahlen und eine Zusatzzahl. Das Ganze wird geordnet ausgegeben und Doppelgänger werden vermieden.
Bevor man ein Zufallsprogramm akzeptiert, sollte man es 1000 mal laufen lassen und die gleichberechtigte Verteilung und Unberechenbarkeit der Zahlenfolge mit dem Computer Überprüfen.
Sie brauchen 2 Befehlsbuttons und eine Textarea um das Programm in Gang zu bringen.
Der Quelltext hinter dem Befehlsfeld Lottozahlen lautet:
' Gambas class file ar AS Integer[] PUBLIC SUB Form_Open() 'schon beim Öffnen der Form wird der Array mit lauter Nullen gefüllt. x AS Integer ar = NEW Integer[] ME.Text = "Lottozahlen" FOR x = 0 TO 48 ar.Add(Str(0)) NEXT END PUBLIC SUB Button1_Click() x AS Integer r AS Integer element AS Integer txt AS String z AS Integer txt = "" 'der Array wird komplett auf Null gestellt FOR x = 0 TO 48 ar[x] = 0 NEXT 'dann wird der Array mit 6 Zufallszahlen an den Stellen gefüllt, die mit der Zufallszahl übereinstimmen Randomize() FOR x = 0 TO 5 r = Int(Rnd(1,49)) IF r = ar[r] THEN x = x - 1 'Falls ein Doppelgänger auftritt gehe eins zurück ar[r] = r NEXT 'nur die Zahlen ungleich 0 (<> 0 ) werden ausgegeben FOR EACH element IN ar IF element <> 0 THEN txt = txt & element & Chr(10) NEXT 'Zusatzzahl suchen , die nicht schon gezogen wurde REPEAT z = Int(Rnd(1,49)) UNTIL z <> ar[z] 'Textausgabe wird zusammengestellt txt = txt & Chr(10) & "Zusatzzahl: " & z textarea1.Text = txt END PUBLIC SUB Button2_Click() ME.Close END
Zufallsbuchstaben
[Bearbeiten]Diese Programm erzeugt Zufallsbuchstaben zwischen A und Z. Das Ergebnis wird in einer Textarea ausgegeben.
Sie brauchen eine Textarea und 2 Commandbuttons, um das Programm in Gang zu bringen. Es schaut dann in etwas so aus:
Der Quelltext hinter dem Befehlsfeld Zufallsbuchstaben lautet:
PUBLIC SUB Button1_Click() DIM Z AS Integer DIM Buchstabe AS String Randomize() Textarea1.Text = "" FOR Z = 1 TO 50 Buchstabe = Chr$(Int(Rnd(65,91))) TextArea1.Text = TextArea1.Text & Buchstabe NEXT END
Mit dem Befehl CHR$ werden Zahlen zu Buchstaben umgewandelt.
Character = Chr$ ( Zahl ) gibt das Zeichen zurück, welches dem ASCII code von Zahl entspricht .
Beispiel 1:
PRINT Chr$(65)
Ergebnis: A
Beispiel 2:
PUBLIC SUB Button1_Click() DIM x AS Integer FOR x = 30 TO 133 PRINT Chr$(x); NEXT END
Zufallspunkte
[Bearbeiten]Mit dem folgenden Programm können Sie ein Zeichenfeld ( DrawingArea ) mit Zufallspunkten füllen.
Sie brauchen für das Programm:
- eine Drawingarea
- zwei Commandbuttons.
Das Ganze schaut dann so aus:
Der Code dazu:
PUBLIC SUB Button1_Click() x AS Integer y AS Integer z AS Integer Draw.Begin(DrawingArea1) FOR z = 1 TO 100000 x = Int(Rnd(0,DrawingArea1.Width)) y = Int(Rnd(0,DrawingArea1.Height)) Draw.Point(x,y) NEXT Draw.End END PUBLIC SUB Button2_Click() ME.Close END
Zufallsquadrate
[Bearbeiten]Confetti Programm
Mit dem folgenden Confettiprogramm wird ein Zeichnungsfeld mit vielen kleinen , verschieden farbigen Quadraten gefüllt. In dem Programm taucht 3 mal der Zufall auf: 1.Die Farbe ist per Zufall gewählt. 2.Die x Koordinate der Quadrate ist per Zufall gewählt. 3.Die y Koordinate der Quadrate ist per Zufall gewählt.
Man braucht eine Form , darauf plaziert man eine Drawing Area. Dann braucht man noch 2 Commandbuttons.
Das Ganze schaut so aus:
Der Code dazu:
PUBLIC SUB Form_Open() Button1.Text = "Start" Button2.Text = "Stop" END PUBLIC SUB Button1_Click() i AS Integer X AS Integer Y AS Integer Draw.Begin(DrawingArea1) FOR i = 1 TO 200000 Draw.FillColor = Int(Rnd(&HFFFFFF&)) 'PRINT Int(Rnd(&HFFFFFF&)) Draw.FillStyle = Fill.Solid X = Int(Rnd(DrawingArea1.Width)) Y = Int(Rnd(DrawingArea1.Height)) Draw.Rect(X - 7, Y - 7, 7, 7) NEXT Draw.End END PUBLIC SUB Button2_Click() ME.Close END