Deterministischer platformübergreifender Zufallszahlengeneratoren gesucht



  • Hallo, ich brauche einen Pseudo-Zufallszahlengenerator, der mir verlässlich deterministische Zufallszahlen liefert (zu gegebenem Seed). Dies sollten auch Platform-übergreifend (Windows/Linux) die *gleichen* Zahlen sein.
    Keine hohen Anforderungen an die "Zufälligkeit", ist für ein Spiel.

    Gehe ich richtig in der Annahme dass
    - C-Library rand() diese Anforderungen *nicht* erfüllt, da Implementierungsabhängig.
    Ausserdem hält rand ja irgendwo globalen State, so dass ich nicht sicher sein kann dass fremnder Code den State nicht ändert. Denn meine App lädt Plug-Ins als DLLs, falls diese auch rand() aufrufen hab ich in meiner Main-App andere Zahlenfolgen, richtig?

    - Dass zB. boost::random::minstd_rand die Anforderungen erfüllt?
    Da ist jeder Generator eine eigene Instanz, richtig?
    Und ich kann mir sicher sein dass nicht im Hintergrund doch irgendwie rand() aufgerufen wird?


  • Mod

    Alle Zufallszahlengeneratoren mit eigenem Namen in Boost und/oder der C++Standardbibliothek erfüllen deine Anforderungen.



  • PRNG ist heutzutage quasi gleichbedeutend mit MT19937 oder MT19937-64, in C++ wären das std::mt19937 und std::mt19937_64.
    Nicht nur liefern diese gute Zufallszahlen, sie sind auch in Sachen Geschwindigkeit kaum zu übertreffen, MT19937-64 produziert etwa auf einem aktuellen System 4-5 GB/s an Zufall.



  • Gut sind sie schon, aber nicht unbedingt sehr gut.

    Xorshift+ und Xoroshiro+ sind gute Alternativen. Schneller, je nach Anwendung bessere Zahlen, viel weniger Speicherverbrauch.



  • Nach dieser Tabelle
    http://www.boost.org/doc/libs/1_66_0/doc/html/boost_random/reference.html#boost_random.reference.generators
    sind die MT19937s zwar schnell aber auch (relatif) speicherhungrig.
    Da ich nichts wirklich kompliziertes brauche hab ich deshalb minstd_rand genommen.
    taus88 oder rand48 wären wohl der beste Speicher/Speed Kompromiss bei geringen Anforderungen.


  • Mod

    scrontch schrieb:

    Nach dieser Tabelle
    http://www.boost.org/doc/libs/1_66_0/doc/html/boost_random/reference.html#boost_random.reference.generators
    sind die MT19937s zwar schnell aber auch (relatif) speicherhungrig.
    Da ich nichts wirklich kompliziertes brauche hab ich deshalb minstd_rand genommen.
    taus88 oder rand48 wären wohl der beste Speicher/Speed Kompromiss bei geringen Anforderungen.

    Sag nichts schlechtes über TAUS88. Bloß weil ein Generator schnell ist, ist er nicht schlecht. Ebenso die Generatoren, die hustbaer genannt hat, und viele andere auch. Die sind allesamt absolut geeignet für wissenschaftliches Rechnen.



  • scrontch schrieb:

    Da ich nichts wirklich kompliziertes brauche hab ich deshalb minstd_rand genommen.

    Wenn du dann doch einen schlechten und langsamen RNG nimmst, wozu hast du den Thread erstellt?

    scrontch schrieb:

    sind die MT19937s zwar schnell aber auch (relatif) speicherhungrig.

    Wie viele Millionen verschiedene RNG-Instanzen brauchst du gleichzeitig, damit das eine Rolle spielt? Das lässt sich sicher auch anders lösen.

    scrontch schrieb:

    taus88 oder rand48 wären wohl der beste Speicher/Speed Kompromiss bei geringen Anforderungen.

    Wie kommst du zu dieser Erkenntnis? Xoroshiro128+ hat 16 bytes state, besteht aus 10 Zeilen Code, schlägt qualitätsmäßig wohl alle auf der boost-Liste (außer ranlux) und bei "approx. speed compared to fastest" stände da 200%.



  • seashell schrieb:

    [...], wozu hast du den Thread erstellt?

    Das hat wahrscheinlich wirklich Niemand richtig verstanden hier. 🙄 Der Thread ging *nicht* um einen Performancevergleich zwischen RNGs, sondern lediglich darum, sicherzustellen dass die Std/Boost RNGs deterministisch und die Instanzen voneinander unabhängig sind. Die Frage war schon nach der ersten Antwort beantwortet und von mir aus kann der Thread geschlossen werden.

    seashell schrieb:

    scrontch schrieb:

    taus88 oder rand48 wären wohl der beste Speicher/Speed Kompromiss bei geringen Anforderungen.

    Wie kommst du zu dieser Erkenntnis? Xoroshiro128+ hat 16 bytes state, besteht aus 10 Zeilen Code, schlägt qualitätsmäßig wohl alle auf der boost-Liste (außer ranlux) und bei "approx. speed compared to fastest" stände da 200%.

    Es dürfte klar sein dass ich mich auf die Liste bezogen habe.
    Im übrigen beanspruche ich keinerlei Kompetenz bzgl RNGs.
    Prima für Xoroshiro128+.
    Jetzt muss der nur noch in Std/Boost.
    Weil sonst ... can't be bothered.



  • Diese Zufallszahlengeneratoren sind nichts weiter, als mehrere von einander abhängige XOR-Verknüpfungen und lassen sich daher doch relativ entspannt selbst schreiben.

    Also wenn deine Plattformen C oder C++ können, dann können sie doch auch die entsprechende Funktion aufrufen. Plattform übergreifender als C oder C++ geht doch gar nicht, und dann auch noch eine selbst geschriebene Funktion..... 🙄


Log in to reply