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 ichengine
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 gleichmersenne_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? <- HauptproblemWeil 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