Auch (double(rand())/RAND_MAX) erzeugt keine „echten“ Zufallszahlen
-
Hallo,
vielfach wird in den Fachbüchern behauptet, dass man mit (double(rand())/RAND_MAX) in Verbindung mit der Initialisierung srand(time(0)) „echte“ Zufallszahlen erhält.
Dies kann ich leider nicht bestätigen. Selbst bei 10.000.000 Durchläufen ist die Verteilung auf die einzelnen Zahlen ungleichmäßig: Die Standardabweichung beträgt mindestens 0,3%, manchmal sogar über 1% (!!). Hierbei spielt es keine Rolle, ob nun eine Zufallszahl aus einem Bereich von zehn Zahlen oder hundert Zahlen erzeugt werden soll.
Woran könnte das liegen?
Mit solchen Abweichungen lässt sich’s wirklich nicht leben, Wahrscheinlichkeitsberechnungen sind nahezu ausgeschlossen.
Hat jemand eine Idee, wie man eine wirklich echte Zufallszahlen erzeugen kann?
-
Hallo,
Schau doch mal hier
http://de.wikipedia.org/wiki/Physikalischer_Zufallszahlengenerator
-
Hallo!
Was meinst Du mit die Standardabweichung ist mindestens 0,3%? Was erwartest Du denn? Die Gleichverteilung hat auch ne Varianz (und damit ne Standardabweichung).
Oder meinst Du garnicht Standardabweichung, sondern daß die generierten Zahlen nicht absolut gleich verteilt sind? Das kann an mehreren Sachen liegen. Problematisch ist es zum Beispiel, wenn man mit modulo auf kleinere Zahlen geht:
Nehmen wir an, RAND_MAX wäre nur 3. Berechnen wir nun mit rand Zahlen von 0 bis 1, also rand()%2, dann ist die 0 doppelt so wahrscheinlich, wie die 1. Ähnliches kann natürlich auch bei großem RAND_MAX passieren.
Kannst Du vielleicht mal ein bißchen präziser beschreiben, was Du genau haben möchtest? Vielleicht gibt's ja doch nen einfachen Trick dafür. Sonst kannst Du auch mal bei boost (www.boost.org) vorbeischaun, die haben einige ganz nette Sachen zu Zufallszahlen.
-
Hallo Jester,
wie ich schon geschrieben habe: ich meine nicht die Gleichverteilung (die ist okay), sondern die Standardabweichung, die für meine Begriffe ziemlich hoch ist (man bedenke das Verhältnis 10.000.000 Durchläufe und immer noch Abweichungen von bis zu 1%).
Mit dem Modulooperator arbeite ich natürlich nicht, sondern mit der Formel (double(rand())/RAND_MAX)*n.
-
Was meinst du mit "Standardabweichung" genau? Bei einer gleichmäßigen Verteilung sollte diese doch eigentlich deutlich höher als 1% liegen, wenn mich die Überreste meiner Mathe-Kenntnisse nicht gerade im Stich lassen.
Und zeig doch mal den Code, mit dem du diese Berechnungen angestellt hast

(ein typischer Fehler im Umgang mit rand() ist, daß man den Zufallsgenerator zu oft initialisiert - srand() wird einmal bei Programmstart aufgerufen und danach nie wieder)
-
Alexander Rahm schrieb:
Hallo Jester,
wie ich schon geschrieben habe: ich meine nicht die Gleichverteilung (die ist okay), sondern die Standardabweichung, die für meine Begriffe ziemlich hoch ist (man bedenke das Verhältnis 10.000.000 Durchläufe und immer noch Abweichungen von bis zu 1%).
Mit dem Modulooperator arbeite ich natürlich nicht, sondern mit der Formel (double(rand())/RAND_MAX)*n.Die Frage ist wieviel Zahlen du benutzt, also was ist n bei dir? Bei mir ist die Abweichung nicht so hoch. Trotzdem sind andere Libs, z.B. Boost besser. Beispiel:
Oben - Boost-C++-Library
Unten - C-Standard-LibraryDurchlaeufe: 500000000 Zeit: 41 Sekunden Zahlen: 10 0: 10.001% 1: 10.001% 2: 9.999% 3: 9.999% 4: 10.000% 5: 10.001% 6: 10.000% 7: 10.000% 8: 10.000% 9: 9.998% Durchlaeufe: 500000000 Zeit: 50 Sekunden Zahlen: 10 0: 10.000% 1: 10.003% 2: 10.001% 3: 9.996% 4: 9.999% 5: 10.002% 6: 9.998% 7: 9.999% 8: 10.002% 9: 9.997%mfg.