Mersenne-Twister Implementation braucht statische Engine in Funktion[C++11]



  • Hallo!

    So, hab mich wieder ein wenig mit C++11 befasst, und da ist mir auch die nützliche Implementation eines Zufall-Generators ala Mersenne-Twister über den Weg gelaufen. War sogleich am rumspielen:

    #include <random>
    #include <functional>
    #include <iostream>
    
    template<class type>
    type xrand(type min, type max)
    {
        std::uniform_int_distribution<type> scatter(min, max);
        static std::mt19937 engine;
        return scatter(engine);
    }
    
    int main()
    {
        for(int a;a < 100;++a)
            std::cout << xrand(0, 100) << '\n';
    }
    

    1. Wieso heißt es mt19937 ? Waren die besoffen oder was?
    2. Nur wenn ich engine static mache, kommt nicht 100 mal dasselbe Ergebniss heraus! Wieso ist das so? <- Hauptproblem
    3. Das Präfix ' mt ' steht ja für Mersenne Twister, seh ich das richtig?
    4. Gibt es nicht ein Template, das gleich mersenne_twister heißt? Das erkennt mein Compiler nicht (GCC ID Makros? mersenne_twister is not a member...).

    VD im VR

    😋



  • Zu deinen drei Namensfragen: Ein einfacher Blick in Wikipedia hätte dir gesagt, dass der MT19937 wegen seiner Periodenlänge seinen Namen hat.

    Zur zweiten Frage: Wie sollen denn unterschiedliche Zufallszahlen generiert werden, wenn du immer mit frisch initialisierten Objekten hantierst?



  • Hacker schrieb:

    1. Wieso heißt es mt19937 ? Waren die besoffen oder was?

    Nein die waren nicht besoffen. Die spezielle Instanz des Algorithmus heißt eben so. Wenn du's einfach mal gegoogled hättest, hätte Wikipedia dir das auch verraten.

    Hacker schrieb:

    2. Nur wenn ich engine static mache, kommt nicht 100 mal dasselbe Ergebniss heraus! Wieso ist das so? <- Hauptproblem

    Weil du ohne das static bei jedem Aufruf eine neue Engine mit dem default Seed erzeugst?

    Hacker schrieb:

    3. Das Präfix ' mt ' steht ja für Mersenne Twister, seh ich das richtig?

    Ja

    Hacker schrieb:

    4. Gibt es nicht ein Template, das gleich mersenne_twister heißt? Das erkennt mein Compiler nicht (GCC ID Makros? mersenne_twister is not a member...).

    Wie der Doku deines Compilers sicher unschwer zu entnehmen ist, heißt das Template mersenne_twister_engine .



  • Danke schonmal, bitte keine rethorischen/arroganten Fragen mehr. Also keine Fragezeichen hinter deine Antworten, dot 🙂
    Auf Wikipedia steht übrigens garnichts. Einfach nur ein Kommentar:

    std::mt19937 engine; // Mersenne twister MT19937
    

    Dass hab ich auch schon gesehen. Da steht nix von Perioden.



  • http://en.wikipedia.org/wiki/Mersenne_twister#Advantages

    Hacker schrieb:

    Danke schonmal, bitte keine rethorischen/arroganten Fragen mehr. Also keine Fragezeichen hinter deine Antworten, dot 🙂

    Ich mach soviele Fragezeichen wie ich will.



  • dot schrieb:

    http://en.wikipedia.org/wiki/Mersenne_twister#Advantages

    Hacker schrieb:

    Danke schonmal, bitte keine rethorischen/arroganten Fragen mehr. Also keine Fragezeichen hinter deine Antworten, dot 🙂

    Ich mach soviele Fragezeichen wie ich will.

    Ah, gut! Deinen Link von M.E. vorhin hab ich übersehen.



  • Ich hab keinen Link gepostet. Ich hätte dir die deutsche Wikipedia verlinkt, auf der es ebenfalls steht.



  • Michael E. schrieb:

    Ich hab keinen Link gepostet. Ich hätte dir die deutsche Wikipedia verlinkt, auf der es ebenfalls steht.

    Editiert 😃


Log in to reply