Algorithmus rand ()
-
Hi Leute!
Ich bin schon ein kleines bisschen neugierig, wenn ich nicht genau weiß, wie die Dinge laufen. Deswegen eine Frage:
Wie genau funktioniert rand ()??
Diese Funktion hat, nehme ich an, einen globalen Startwert, welcher mit srand ()
definiert wird.Gut, was nun kommt, ist der Algorithmus zur Erzeugung stochastisch zufälliger Zahlen, die alle über dem Wertebereich verteilt sind.
Ich bin von der Idee einer Chaoskomponte mit Attraktor-Ansatz sehr schnell weggekommen und wollte das hier mal in die Runde werfen.Denn, im Ernst: Wer hat sich nicht schon mal gefragt: Wie macht rand () das überhaupt??
-
Theoretisch: Es gibt eine Funktion, die aus aktuellen Startwert zwei neue Werte berechnet, die möglichst "zufällig" über den gesamten Wertebereich verteilt sind. Einer dieser Werte wird ausgegeben, der andere als neuer Startwert gespeichert (für den nächsten Aufruf).
(das "möglichst zufällig" kann noch in konkrete Formeln gefasst werden - aber im Allgemeinen ist die Folge von Zufallszahlen deterministisch)
-
Hier mal die Implementation von rand im BCB6
#define MULTIPLIER 0x015a4e35L #define INCREMENT 1 // Seed.lo ist normalerweise 1 kann aber mit srand gesetzt werden int _RTLENTRY _EXPFUNC rand(void) { Seed.lo = MULTIPLIER * Seed.lo + INCREMENT; return((int)(Seed.lo >> 16) & 0x7fff); }
-
Da sollte man auch noch einiges finden:
http://paul.rutgers.edu/~rhoads/Code/code.html