Buchempfehlung
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Umfassend, aber leicht verständlich führt dieses Buch in die Programmierung von ATMEL AVR Mikrocontrollern ein. [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 4 von 5

Zufallszahl von 'x' bis 'y'

Zu einer Zufallszahl von (z. B.) 3 bis 7 ist es jetzt nicht mehr weit. Der Bereich umfasst 5 Zahlen (3, 4, 5, 6, 7); berechnen lässt sich das über (7-3)+1=5. Also wird zunächst einmal INT(RND*5) verwendet. Die damit erzielten Ergebnisse liegen im Bereich von 0 bis 4, sind also um 3 zu klein. Wie man den Wert einer Zahl um 3 erhöht, sollte klar sein ...

DIM AS INTEGER zufall
PRINT "Erzeuge zehn Zufallszahlen von 3 bis 7

RANDOMIZE
FOR i AS INTEGER = 1 TO 10
  zufall = INT(RND*5)+3
  PRINT zufall
NEXT
SLEEP

Nebenbei ein Hinweis: Lassen Sie solche Programme ruhig ein paar mal laufen und überprüfen Sie die Ergebnisse. Ein möglicher Fehler fällt vielleicht erst bei mehrmaligem Versuch auf (vielleicht aber auch nicht).

Anwendung: Verteilung der Augensumme beim Wurf von drei Würfeln
Wird aus drei Würfeln die Augensumme gebildet, dann werden die "Randergebnisse" 3 und 18 seltener auftreten als Ergebnisse in der Mitte, also z. B. 10 oder 11. Das folgende Programm simuliert 1000 mal den Wurf von drei Würfeln und zählt, welche Augensumme wie häufig erzielt wurde.

DIM AS INTEGER wurf(1 TO 3), summe, zaehl(20)
RANDOMIZE

' Simulation starten
FOR durchgang AS INTEGER = 1 TO 1000
  ' drei Würfel werfen
  FOR wuerfel AS INTEGER = 1 TO 3
    wurf(wuerfel) = INT(RND*6) + 1  ' Zufallszahl von 1 bis 6
  NEXT
  summe = wurf(1)+wurf(2)+wurf(3)   ' Augensumme bilden ...
  zaehl(summe) += 1                 ' ... und hochzählen
NEXT

' Ausgabe
FOR summe = 0 TO 20
  PRINT USING("Augensumme ##: ###.#%"); summe, zaehl(summe)/10
NEXT
SLEEP

Der Code ließe sich noch ein gutes Stück kompakter schreiben, worauf aus Gründen der Übersichtlichkeit verzichtet wurde. Außerdem würde es natürlich reichen, die Augensummen von 3 bis 18 zu zählen. So bestätigt aber auch die Ausgabe, dass Summen kleiner als 3 sowie Summen größer als 18 nicht auftreten.

Zum Abschluss noch einmal allgemein eine (ganzzahlige) Zufallszahl von x bis y:
Der Bereich enthält (y-x+1) Zahlen, von denen die kleinste x ist. Als Rechenformel ergibt sich

zufall = INT(RND*(y-x+1)) + x   ' zufällige Ganzzahl von x bis y

Zur Kontrolle:
Der kleinstmögliche RND-Wert ist 0; INT(0*(y-x+1)) + x = INT(0) + x = x
Der größtmögliche RND-Wert ist kleiner als 1, damit ist das Ergebnis kleiner als INT(1*(y-x+1)) + x = INT(y-x+1) + x = y+1, wobei die nächstkleinere Zahl natürlich y ist. Der Zahlenbereich stimmt also.
Wenn Sie des öfteren Zufallszahlen aus verschiedenen Bereichen benötigen, können Sie sich die Rechnung auch in einer Funktion zusammenfassen. Für alle, die das Tutorial bis hierher durchgelesen haben, gibt es als Belohnung ein kleines Makro:

#DEFINE zufallszahl(von, bis) (INT(RND*(bis - von + 1)) + von)
RANDOMIZE
PRINT zufallszahl(3, 7)  ' Zufallszahl von 3 bis 7

 

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 30.11.2020 von Redakteurnemored gespeichert.
  Bearbeiten Bearbeiten  

  Versionen Versionen