Buchempfehlung
Windows System Programming
Windows System Programming
Das Kompendium liefert viele interessante Informationen zur Windows-Programmierung auf Englisch. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

Tutorial

Zufallszahlen verwenden

von RedakteurnemoredSeite 3 von 5

Zufallszahl von 0 bis 'y'

Eine immer wieder gestellte Frage ist: Wie erzeuge ich eine Zufallszahl im Bereich von x bis y, also etwa von 3 bis 7 oder einem beliebigen anderen Zahlenbereich?

Wir wollen die Frage Schritt für Schritt angehen. Eine Zufallszahl von 0 bis z. B. 4 zu erzeugen, ist nicht allzu schwer. Mit RND erhalten Sie eine Zahl von 0 bis 1 - wenn Sie diese Zahl mit 4 multiplizieren, ist das Ergebnis eine Zahl von 0 bis 4.

zufallszahl = RND*4

Das war es auch schon. Nun - zumindest fast. Wenn Sie DOUBLE-Zahlen benötigen, ist diese Methode tatsächlich schon genau das, was Sie brauchen. Wenn Sie als zufallszahl aber BefehlsreferenzeintragINTEGER-Zahlen verwenden wollen, dann gibt es hier ein Problem, das möglicherweise gar nicht so schnell auffällt.

DIM AS INTEGER zufall, zaehl(0 TO 4)

' Zufallszahlen erzeugen
RANDOMIZE
FOR i AS INTEGER = 1 TO 100000
  zufall = RND*4
  zaehl(zufall) += 1   ' zählen, wie oft jede Zahl gefallen ist
NEXT

' Anzahl der einzelnen Werte ausgeben
FOR i AS INTEGER = 0 TO 4
  PRINT "Die Zahl " & i & " ist " & zaehl(i) & " mal gefallen."
NEXT
SLEEP

Mögliche Ausgabe (zufallsabhängig!):

Die Zahl 0 ist 12587 mal gefallen.
Die Zahl 1 ist 24609 mal gefallen.
Die Zahl 2 ist 25161 mal gefallen.
Die Zahl 3 ist 25077 mal gefallen.
Die Zahl 4 ist 12566 mal gefallen.

Offenbar tritt 0 und 4 nur halb so oft auf wie 1, 2 und 3. Der Grund dafür dürfte klar sein: bis 0.5 wird auf 0 abgerundet, ab 3.5 wird auf 4 aufgerundet. Eine Rundung auf 1 findet aber bei einem Ergebnis zwischen 0.5 und 1.5 statt, also in einem doppelt so großen Zahlenbereich. Klar, dass dann auch etwa doppelt so oft eine 1 gezählt wird.

Mit etwas Hilfe der eingebauten Rundungsfunktionen ist das schnell in den Griff zu bekommen. BefehlsreferenzeintragINT rundet immer ab, also ist der Zahlenbereich für jede Zahl gleich groß. Mit einer kleinen Änderung erhalten wir dann dieses:

DIM AS INTEGER zufall, zaehl(0 TO 4)

' Zufallszahlen erzeugen
RANDOMIZE
FOR i AS INTEGER = 1 TO 100000
  zufall = INT(RND*4)
  zaehl(zufall) += 1   ' zählen, wie oft jede Zahl gefallen ist
NEXT

' Anzahl der einzelnen Werte ausgeben
FOR i AS INTEGER = 0 TO 4
  PRINT "Die Zahl " & i & " ist " & zaehl(i) & " mal gefallen."
NEXT
SLEEP

Mögliche Ausgabe (zufallsabhängig!):

Die Zahl 0 ist 24868 mal gefallen.
Die Zahl 1 ist 25042 mal gefallen.
Die Zahl 2 ist 25266 mal gefallen.
Die Zahl 3 ist 24824 mal gefallen.
Die Zahl 4 ist 0 mal gefallen.

Der kleinen Schönheitsfehler mit der 4 ist auch schnell ausgebügelt. Einfach aus INT(RND*4) ein INT(RND*5) gemacht, und schon gibt es 5 mögliche Werte (von 0 bis 4).

Wir halten fest:
INT(RND*wert) erzeugt eine ganzzahlige Zufallszahl von 0 bis (wert-1).

 

Gehe zu Seite Gehe zu Seite  1  2  3  4  5  
Zusätzliche Informationen und Funktionen
  • Das Tutorial wurde am 03.09.2011 von Redakteurnemored angelegt.
  • Die aktuellste Version wurde am 08.04.2012 von RedakteurMOD gespeichert.
  Bearbeiten Bearbeiten  

  Versionen Versionen