Tutorial
Zufallszahlen verwenden
von nemored | Seite 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 INTEGER-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. INT 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).
Zusätzliche Informationen und Funktionen | |||||||
---|---|---|---|---|---|---|---|
|