wie werden random numbers errechnet?



  • hi,
    mich würd ja mal interressieren wie der pc zufallszahlen errechnet!
    ich möcht jetzt nicht wissen wie eine hochsprachenimplementation aussehen würde.
    ich hab glaub ich mal irgendwo gelesen, dass die aus der systezeit errechnet werden.
    stimmt das, und wenn ja wie????????????????

    danke fürs interrese!



  • Für "einfache" Zufallszahlen ist folgendes üblich:

    Der Zufalölsgenerator wird mit der aktuellen Systemziet in Sekunden oder millisekunden seit dem 1.1.1970 initialisiert. Danach berechnet der Computer eine Zufallszahl aus der vorherigen und der Startzahl durch eine Formel, für dieselbe Startzahl bekommt man also auch immer dieselben Zufallszahlen.

    Bei "sicheren" Zufallszahlen gibts zumindest unter Unix sowas wie /dev/random. Im Prinzip hält der Kernel dabei einen Pool an potentiell Zufälligen Variablen die im System so auftreten, z.B. Zeit, Zahl der Festplattenanfragen, Zahl der verschickten Netzwerkpakete, etc. über diesen ganzen Haufen werden dannd ie Zufallszahlen gebildet. Das ist zwar etwas langsamer, erzeugt aber für die Vershclüsselung anscheinend sicherere Zahlen.



  • und wie sieht die formel ungefähr aus?



  • Also die von der Microsoft Runtime Library sieht so aus:

    r = initialisierungswert;

    Beim aufruf von rand():
    r = (r * 214013 + 2531011);
    Rückgabewert: (r / 32768) & 0x7ffff

    Die Güte der Zahlen hängt von den beiden Parametern ab. Primzahlen sind auf jeden Fall sehr gut dafür. Aber auhc da gibts gute und schlechte.

    Die GNU-C-Library hab ich gerade nicht im Quellcode da, wird aber im Prinzip ähnlich aussehen, nur eventuell mit anderen Parametern.



  • andere Konstanten, siehe z.B.: http://cplus.kompf.de/artikel/random.html

    Die rand() Funktion arbeitet intern nach der Formel x = (a * x + c) % m
    wobei x die erzeugte Zufallszahl ist (die also zwischen den Aufrufen von rand() in der C-Library zwischengespeichert werden muss) und a, c, m sorgfältig ausgewählte Konstanten sind (die rand() Funktion unter BSD-Unix verwendet hier zum Beispiel a = 1103515245, c = 12345 und m = 231).



  • ist die implementierung von rand irgendwo vorgeschrieben? ich glaube nicht 😉



  • Original erstellt von <gerst>:
    ist die implementierung von rand irgendwo vorgeschrieben? ich glaube nicht 😉

    Nein, aber das ist ne Standardnummer die so gut wie jeder benutzt 🙂



  • Allerdins ist diese Art der Zufallszahlenerzeugung nicht Kryptographisch sicher. In folgenden Büchern/Artikeln wird beschrieben, wie man sie voraussagt:
    1.) J.B. Plumstead, "Inferring a Sequence Generated by a Linear Congruence," Proceedings of the 23rd IEEE Symposium on the Foundations of Computer Science,1982, pp.153-159.
    2.) J.A. Reeds, Cracking Random Number Generators," Cryptologia v.1, n.1, Jan. 1977, pp. 20-26
    und noch jede Menge andere. Aber für Simulationen und Spiele reichts.




Anmelden zum Antworten