Syntax
Floatwert=Rnd(Wert1#[,Wert2#])
Parameter
- Wert1 : erforderlich, Grenzwert1
- Wert2 : optional, Grenzwert2, Defaultwert=0
Rückgabe
Eine zufällige Floatzahl, die zwischen den Grenzwerten liegt
Hinweise
- 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
Es 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
Zufall
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
Mein 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