Gambas: Zufall

Aus Wikibooks


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.

Screenshot zum Programm Lottozahlen

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

Münzwurf Statistik[Bearbeiten]