Zum Inhalt springen

BlitzBasic: Rnd

Aus Wikibooks

Syntax

[Bearbeiten]

Floatwert=Rnd(Wert1#[,Wert2#])

Parameter

[Bearbeiten]
  • Wert1 : erforderlich, Grenzwert1
  • Wert2 : optional, Grenzwert2, Defaultwert=0

Rückgabe

[Bearbeiten]

Eine zufällige Floatzahl, die zwischen den Grenzwerten liegt

Hinweise

[Bearbeiten]
  1. 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).
  2. 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.
  3. 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

[Bearbeiten]

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

[Bearbeiten]

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

[Bearbeiten]

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