Box-Müller-Methode in C++



  • Das verkürzt die Periode auf ein Viertel und hat wahrscheinlich bescheidene Eigenschaften bzgl. Zufälligkeit. Nimm lieber nen PRNG, der für größere Zahlen ausgelegt ist.


  • Mod

    Also für Monte Carlo ist rand() sowieso nicht gut, weil man nie weiß was dahinter steckt. Normalerweise ist das ein ganz einfacher LCG und der ist für ernsthaftes MC absolut ungeeignet. Such dir am besten einen guten, schnellen Zufallsgenerator (multiply and carry, TAUS, ...) und implementier den selbst oder nimm eine fertige Implementierung, z.B. aus der GSL. Da ist der Zahlenraum dann auch mindestens 32 Bit, du findest bestimmt auch welche mit 64-Bit.



  • o.k., danke für den tipp / die tipps.
    (wobei rand() für diese monte carlo simulation noch auszureichen schien. denn bei 50Mio. Simulationen war das numerische Ergebnis identisch mit dem analytischen aus dem Black-Scholes-Modell zur Optionspreisbewertung.)

    kurze frage nochmal des informatik-laien. hab in der library hinsichtlich des befehls RAND_MAX folgendes gefunden:

    #define RAND_MAX 0x7FFF

    was genau sagt jetzt dieses 0x7FFF aus?


  • Mod

    Tobias K. schrieb:

    was genau sagt jetzt dieses 0x7FFF aus?

    32767

    Und das erklärt auch, warum bei dir die 0 so wahrscheinlich ist und warum ich auf dem Computer an dem ich getestet habe (RAND_MAX = 2147483647) viele Millionen Schritte ohne 0 machen konnte.

    (Und es sagt, dass ich mit meiner Antwort ganz zu Anfang zu 100% Recht hatte 😉 )



  • Das ist auf jeden Fall schonmal interessant zu wissen.

    was genau müsste ich denn da statt 0x7FFF eingeben um auch 2147483647 mögliche zahlen zu erhalten? oder kann ich da nicht einfach so rumfummeln?


  • Mod

    Tobias K. schrieb:

    oder kann ich da nicht einfach so rumfummeln?

    Dies. Der Wert ist dazu da, dich darüber zu informieren, wie rand() implementiert ist. Der Wert wird von der rand()-Implementierung selbst aber nicht benutzt. D.h. du kannst gerne was ändern, aber das Verhalten von rand() ändert sich nicht. Aber die Programme die du compilierst würden dann falsche Annahmen über RAND_MAX machen.



  • Tobias K. schrieb:

    Das ist auf jeden Fall schonmal interessant zu wissen.

    was genau müsste ich denn da statt 0x7FFF eingeben um auch 2147483647 mögliche zahlen zu erhalten? oder kann ich da nicht einfach so rumfummeln?

    Du solltest da nicht rumfummeln. PRNGs zu ändern ohne sich sehr gut auszukennen, ist meistens eine sehr schlechte Idee. Schnapp dir nen anderen Generator.

    Edit: Jaja, wenn der Tab zehn Minuten geöffnet ist...



  • SeppJ schrieb:

    Der Wert wird von der rand()-Implementierung selbst aber nicht benutzt.

    Die LCGs, die ich bisher gesehen haben, haben alle vor dem return ein &(1<<x) durchgeführt... Ob dabei allerdings auf die Konstante zugegriffen wird, weiß ich nicht.



  • da ich hier keinen C++-Compiler zur Verfügung habe.

    Bei mir funktioniert es astrein.

    Was mir aber aufgefallen ist, dass Du für innere und äussere Schleife die Zählvariable i benutzt. Versuch es mal mit j als innerer!!!!


  • Mod

    Michael E. schrieb:

    SeppJ schrieb:

    Der Wert wird von der rand()-Implementierung selbst aber nicht benutzt.

    Die LCGs, die ich bisher gesehen haben, haben alle vor dem return ein &(1<<x) durchgeführt... Ob dabei allerdings auf die Konstante zugegriffen wird, weiß ich nicht.

    Aber das rand() wird nicht neu compiliert, da wird der fertige Objektcode aus der Standardbibliothek gelinkt, der kennt das Compilezeitmakro gar nicht. Das RAND_MAX ist wirklich nur dazu da, um zur Compilezeit Informationen über die Laufzeitumgebung zu haben. Genauso wie man durch ändern von CHAR_BIT nicht die Größe eine Bytes der Maschine ändern kann.



  • SeppJ schrieb:

    Such dir am besten einen guten, schnellen Zufallsgenerator (multiply and carry, TAUS, ...) und implementier den selbst oder nimm eine fertige Implementierung, z.B. aus der GSL. Da ist der Zahlenraum dann auch mindestens 32 Bit, du findest bestimmt auch welche mit 64-Bit.

    => o.k., also wie schon gesagt, ich bin absoluter anfänger, was programmiersprachen etc. angeht.
    ich hab mir jetzt GSL1.13 runtergeladen und den ordner zu den anderen bibliotheken kopiert. aber was genau mache ich nun?
    ich habe versucht eine header-datei von dem ordner to "include", aber das funktioniert nicht. wie genau komme ich nun an meine "bessere" ZV ran?^^

    sorry, wenn ich euch hier mit anfänger-fragen bugge.


Anmelden zum Antworten