QT C++ Random Zahlen / Koordinaten
-
Ich hab sowas: (?)
template <typename T> T createRandomReal(const T begin, const T end) { std::random_device rd; std::mt19937 gen(rd()); std::uniform_real_distribution<T> rnd(begin, end); return rnd(gen); } template <typename T> T createRandomInt(const T begin, const T end) { std::random_device rd; std::mt19937 gen(rd()); std::uniform_int_distribution<T> rnd(begin, end); return rnd(gen); }
-
@zeropage Ständig neue random devices und -generators zu erzeugen ist sicher nicht die feine Englische Art.
-
Also lieber sowas:?
namespace random { std::mt19937 randomGenerator; void setRandomDevice() // muss einmalig aufgerufen werden { std::random_device rd; std::mt19937 gen(rd()); randomGenerator = gen; } template <typename T> T createRandomReal(const T begin, const T end) { std::uniform_real_distribution<T> rnd(begin, end); return rnd(randomGenerator); } template <typename T> T createRandomInt(const T begin, const T end) { std::uniform_int_distribution<T> rnd(begin, end); return rnd(randomGenerator); } }
-
@zeropage sagte in QT C++ Random Zahlen / Koordinaten:
std::mt19937 randomGenerator; void setRandomDevice() // muss einmalig aufgerufen werden { std::random_device rd; std::mt19937 gen(rd()); randomGenerator = gen; }
Vielleicht wäre der mt19937 sogar Kandidat für ein Meyer-Singleton. (Nein, ich bin sonst generell kein riesiger Fan von Singletons.)
-
@Swordfish
Fehlt da nicht noch zweimal static? Ansonsten generiere ich pro Aufruf zwei Instanzen von std::random_device und std::mt19937.std::mt19937 randomGenerator; void setRandomDevice(std::mt19937) // muss einmalig aufgerufen werden { static std::random_device rd; static std::mt19937 gen(rd()); randomGenerator = gen; }
-
@Quiche-Lorraine sagte in QT C++ Random Zahlen / Koordinaten:
Fehlt da nicht noch zweimal static? Ansonsten generiere ich pro Aufruf zwei Instanzen von std::random_device und std::mt19937.
Kann du das genauer erklären? Verstehe nicht, wozu das static bei dir gut sein soll - das setRandomDevice soll hier ja nur 1x aufgerufen werden. Wozu musst du also das rd und eine Kopie des mt19937 behalten? Und wo generierst du "pro Aufruf zwei Instanzen von std::random_device und std::mt19937"? Und warum hast du (im Gegensatz zu @Swordfish vorher) jetzt einen unbenutzten Parameter in dem setRandomDevice?
Andererseits: ich verstehe den Vorteil dieses gesamten Codes sowieso nicht: man setzt fest mt19937 ein. Der ist zwar oftmals gut und ausreichend, aber vielleicht möchte man einen anderen Generator nutzen? Oder den mt19937 anders initialisieren? Und dann muss man sich für jede exisiterende Distribution hier jetzt eine eigene weitere Funktion mit anderem Namen merken? Also createRandomInt statt uniform_int_distribution. Ich würde gerne den Vorteil verstehen.
-
@Swordfish sagte in QT C++ Random Zahlen / Koordinaten:
@zeropage sagte in QT C++ Random Zahlen / Koordinaten:
std::mt19937 randomGenerator; void setRandomDevice() // muss einmalig aufgerufen werden { std::random_device rd; std::mt19937 gen(rd()); randomGenerator = gen; }
Vielleicht wäre der mt19937 sogar Kandidat für ein Meyer-Singleton. (Nein, ich bin sonst generell kein riesiger Fan von Singletons.)
Öm. Thread-safety?
Wobei das natürlich bei der Variante von @zeropage auch schon ein Problem ist.
Aber man könnte ein "thread local singleton" machen.
-
@wob @Quiche-Lorraine Das war nicht mein Code sondern ein Zitat von @zeropage s Post.
https://www.modernescpp.com/index.php/thread-safe-initialization-of-a-singleton
-
@Swordfish sagte in QT C++ Random Zahlen / Koordinaten:
https://www.modernescpp.com/index.php/thread-safe-initialization-of-a-singleton
War der Teil auf meinen Beitrag bezogen? Falls ja: Initialisierung reicht nicht, die Verwendung muss ja auch thread-safe werden.
-
@wob sagte in QT C++ Random Zahlen / Koordinaten:
Kann du das genauer erklären?
Sagen wir es mal so. Der Code in Kombination mit dem Schlagwort Singleton hat mich ein wenig verwirrst. Die Funktion setRandomDevice() hat eine gewisse Ähnlichkeit mit der Singleton::GetInstance() Funktion. Von daher kam der Gedanke mit static.
Und warum hast du (im Gegensatz zu @Swordfish vorher) jetzt einen unbenutzten Parameter in dem setRandomDevice?
Sorry, Copy & Paste Fehler vom Testen.