Wie funktioniert SeedRnd?

Übersicht BlitzBasic Allgemein

Gehe zu Seite Zurück  1, 2

Neue Antwort erstellen

DAK

BeitragMi, Aug 16, 2017 10:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Ein guter Zufallszahlengenerator sollte u.A. eine Gleichverteilung haben, heißt, jede Zahl muss genau gleich wahrscheinlich sein.

Das ist hier nicht der Fall, weil über Float gegangen wird. Floats verlieren hald bei zu großen Werten schnell an Genauigkeit. Ein 32-Bit-Float hat 23 Bit Mantisse, kann also ein 24 Bit Int (+1 Bit Vorzeichen) genau darstellen. Sobald die Zahl also über 16777215 kommt, kann sie nicht mehr exakt von einem 32-Bit-Float dargestellt werden. Damit kriegt man dann Rundungsfehler rein, und das sorgt dafür, dass manche Werte nicht mehr vorkommen.

Im Grunde wird jeder Algo, der aus einem Rnd() (Float) ein Rand() (Int) erzeugt, das gleiche Problem haben.

Woher eigentlich das Interesse an den Zufallszahlen? Bzw. hast du vor etwas Bestimmtes damit zu machen?
Gewinner der 6. und der 68. BlitzCodeCompo

Thunder

BeitragMi, Aug 16, 2017 11:45
Antworten mit Zitat
Benutzer-Profile anzeigen
diceman hat Folgendes geschrieben:
Ja, danke! Smile
Noch eine Frage: was genau versteht man unter "schlechter Verteilung von Pseudozufallszahlen"? Ich nehme mal an, daß mit wachsender min-max-Spanne die Wahrscheinlichkeit für einige Zahlen wächst, und für andere sinkt - von was für einem Verhältnis sprechen wir hier? Welche Zahlen werden bevorzugt, große oder kleine?


Genau, deswegen hab ich eigentlich den Vortrag empfohlen, weil der darauf sehr genau eingeht.
Aber jetzt hat DAK schon angefangen, also: du kriegst vom Zufallszahlengenerator meistens eine Funktion die eine festgelegte anzahl von zufälligen Bits ausliest. Das ist in meinem Code die Funktion TT800 die einen 32bit Integer zurückgibt. Für jedes der Bits sollte es gleich wahrscheinlich sein ob es 1 oder 0 ist (siehe DAKs Beitrag, Gleichverteilung). D.h. über die Menge aller Integer 0 bis 2^32-1 habe ich eine Gleichverteilung.

Das Problem taucht dann auf, wenn ich Zahlen nur in einem bestimmten Bereich haben möchte. z.b. von 0-10.
Das einfachste wäre mit Modulo zu arbeiten: (TT800() Mod 11) liefert nur Zahlen zwischen 0 und 10.
Jetzt kannst du, wenn du annimmst dass TT800() gleichverteilte Zahlen liefert, folgern, ob du immer noch eine Gleichverteilung erhältst und welche Zahlen öfter vorkommen falls nicht.
Das entscheidet sich bei den höchsten Integern die TT800() generieren kann:
Code: [AUSKLAPPEN]
TT800()    vs.   (TT800() Mod 11)
0 0
1 1
2 2
3 3
...
4294967281 0
4294967282 1
4294967283 2
4294967284 3
4294967285 4
4294967286 5
4294967287 6
4294967288 7
4294967289 8
4294967290 9
4294967291 10
4294967292 0
4294967293 1
4294967294 2
4294967295 3

Am Ende bleiben 0,1,2,3 übrig. Das heißt, diese kommen ein klein bisschen öfter vor. Du hast keine Gleichverteilung mehr.

Wenn du Rand(min,max) über Floats implementierst, hast du ein Problem mit der Genauigkeit, wie DAK schon erklärt hat. Dann bekommst du Lücken zwischen den Zahlen der Ergebnismenge.
Deswegen habe ich intern mit doubles gearbeitet und gehofft, dass die Genauigkeit für Rand() ausreicht.

Der Vortrag ist übrigens noch weit ausführlicher Wink

SpionAtom

Betreff: PBS Infinite Series

BeitragFr, Okt 13, 2017 9:59
Antworten mit Zitat
Benutzer-Profile anzeigen
How to Generate Pseudorandom Numbers | Infinite Series
https://www.youtube.com/watch?v=C82JyCmtKWg

Hier ein wenig was in Videoform.
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080

Gehe zu Seite Zurück  1, 2

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group