BlitzBasic: Rnd
Syntax
BearbeitenFloatwert=Rnd(Wert1#[,Wert2#])
Parameter
Bearbeiten- Wert1 : erforderlich, Grenzwert1
- Wert2 : optional, Grenzwert2, Defaultwert=0
Rückgabe
BearbeitenEine zufällige Floatzahl, die zwischen den Grenzwerten liegt
Hinweise
Bearbeiten- Bei einer Funktion dürfen optionale Parameter nur am Ende der Parameterliste stehen, darum sind alle Syntax-Schreibweisen falsch, die den ersten Wert als optional angeben (das gilt auch für die Syntax in der IDE-internen Hilfe).
- Manchmal werden auch die Parameter mit »Minimum« und »Maximum« (oder ähnlich) bezeichnet. Auch das ist falsch, da es bei »Rnd« für die Parameter keine Vorschrift gibt, welcher Parameter höher sein muss.
- Für die Rückgabe gilt: "ein Grenzwert" < "Rückgabe" < "anderer Grenzwert". Also die Rückgabe entspricht niemals genau einem der beiden Grenzwerte. (getestet mit einem Programm, das über 24 Stunden Zufallszahlen erzeugte, wobei jeder mögliche Wert durchschnittlich mehr als eine Million mal vorkam. Jedoch beide Grenzwerte kamen nie vor.)
Beschreibung
BearbeitenEs wird ein zufälliger Floatwert erzeugt, der zwischen den beiden Grenzwerten liegt, jedoch nie genau einem der Grenzwerte entspricht. Es können aber nicht beliebig viele verschiedene Zufallszahlen erzeugt werden, sondern da Float auch nur eine 32-Bit-Zahl ist, (24 Bit für die Ziffernfolge und 8 Bit für den Exponenten) können maximal 2^32 = 4294967296 (etwas 4 Milliarden) verschiedene Zahlen erzeugt werden, was aber für die meisten Anwendungen ausreichen müsste. Bei einem Computer sind jedoch alle Berechnungen eindeutig logisch, daher werden keine „echten“ Zufallszahlen erzeugt, sondern ein Berechnungsalgorithmus erzeugt aus einem Startwert irgend eine Zahl, die für den nächsten Aufruf des Algorithmus für die Ermittlung der nächsten Zahl verwendet wird. Folglich werden immer die gleichen Zufallszahlen erzeugt, solange der Startwert sich nicht ändert. Gleiche Startwerte erzeugen also immer die gleichen Zufallszahlen. Den Startwert kann man mit der Funktion RndSeed auslesen und mit der Anweisung SeedRnd setzen.
Gruppe
BearbeitenZufall
In dieser Gruppe sind Anweisungen und Funktionen, die zur Erzeugung von Zufallszahlen genutzt werden.
Typ | Name | KurzInfo | Blitzversionen |
---|---|---|---|
Funktion | Millisecs | liefert die Anzahl der Millisekunden seit Mitternacht | |
Funktion | Rand | liefert eine Integer-Zufallszahl | |
Funktion | Rnd | liefert eine Float-Zufallszahl | |
Funktion | RndSeed | liefert den Startwert für Zufallszahlen | |
Anweisung | SeedRnd | setzt den Startwert für Zufallszahlen |
Beispiel
BearbeitenMein Programm, um zu testen, ob Grenzwerte auch vorkommen. Wer will, kann es ja über Wochen(Monate) laufen lassen, meiner Meinung nach ist es ausreichend, zu sagen dass Grenzwerte nicht vorkommen, wenn andere Werte durchschnittlich über 1 Million mal vorkommen, aber Grenzwerte nicht vorkommen.
Hinweis: Da »Locate« verwendet wird, ist das Beispiel nicht für BlitzPlus geeignet
Global Zufall#,Max%=12,Grenze1#=10,Grenze2#=0,Startwert%=MilliSecs() Dim Wert(1),Counter(Max) SeedRnd Startwert ;Hauptschleife Repeat CounterPlus1 Zufall=Zufallszahl() GrenzwertCounter If (MilliSecs()-t)>1000 Then t=MilliSecs() Ausgabe() Print Print "LMB zum stoppen" EndIf Until MouseHit(1) ;Hauptschleife mit LMB beenden Ausgabe() Print Print "RMB zum beenden" Repeat Until MouseHit(2) ;Programm mit RMB beenden End ;---------------------------------------------------- ;Erhöht den Counter um 1 ;überlauf erst bei 1000^Max Function CounterPlus1() For x=0 To Max If x=0 Then Counter(x)=Counter(x)+1 Else If Counter(x-1)=1000 Then Counter(x-1)=0:Counter(x)=Counter(x)+1 EndIf Next End Function ;Gibt den Counter aus Function CounterAusgabe() x1=0 For x=Max To 0 Step -1 If x1 Or Counter(x) Then If x1 Then Write "."+Right("00"+Counter(x),3) Else Write Counter(x):x1=1 EndIf EndIf Next End Function ;erzeugt eine Zufallszahl zwischen den Grenzen Function Zufallszahl#() If Grenze2 Then Return Rnd(Grenze1,Grenze2) Else Return Rnd(Grenze1) EndIf End Function ;zählt das Auftreten der Grenzwerte Function GrenzwertCounter() If Zufall=Grenze1 Then Wert(0)=Wert(0)+1 If Zufall=Grenze2 Then Wert(1)=Wert(1)+1 End Function ;Statusausgabe Function Ausgabe() Cls:Locate 0,0 Write "Bei " CounterAusgabe() Print " Float-" Print "Zufallswerten von 0-10" Print "wurde "+Wert(0)+"x genau "+Grenze1+" gezogen" Print "und "+Wert(1)+"x genau "+Grenze2+" gezogen" End Function