From b2a056e91ef73892532cc4ea5d694ec226f4db8f Mon Sep 17 00:00:00 2001 From: John Fultz Date: Mon, 14 Jan 2019 04:40:55 -0600 Subject: Resolve #75, update RNG to Mersenne-Twister. --- bag.cpp | 2 +- datamanager.cpp | 15 +++++++++++---- datamanager.h | 6 +++++- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/bag.cpp b/bag.cpp index e4ebef9..a0bb102 100644 --- a/bag.cpp +++ b/bag.cpp @@ -101,7 +101,7 @@ void Bag::exch(const Move &move, Rack &rack) Letter Bag::pluck() { - return erase(DataManager::self()->randomNumber() % m_tiles.size()); + return erase(DataManager::self()->randomInteger(0, m_tiles.size() - 1)); } bool Bag::removeLetters(const LetterString &letters) diff --git a/datamanager.cpp b/datamanager.cpp index 445c314..32bc980 100644 --- a/datamanager.cpp +++ b/datamanager.cpp @@ -43,7 +43,9 @@ DataManager::DataManager() m_self = this; setAppDataDirectory("."); setUserDataDirectory("."); - seedRandomNumbers((int)time(NULL)); + + seed_seq session_seed = {(unsigned) random_device{}(), (unsigned) time(nullptr)}; + seedRandomNumbers(session_seed); m_alphabetParameters = new EnglishAlphabetParameters; m_evaluator = new CatchallEvaluator; @@ -176,10 +178,15 @@ string DataManager::makeDataFilename(const string &subDirectory, const string &f void DataManager::seedRandomNumbers(unsigned int seed) { - srand(seed); + m_mersenneTwisterRng.seed(seed); +} + +void DataManager::seedRandomNumbers(seed_seq& seed) +{ + m_mersenneTwisterRng.seed(seed); } -int DataManager::randomNumber() +int DataManager::randomInteger(int low, int high) { - return rand(); + return uniform_int_distribution<>(low, high)(m_mersenneTwisterRng); } diff --git a/datamanager.h b/datamanager.h index 75bce54..ee896f6 100644 --- a/datamanager.h +++ b/datamanager.h @@ -20,6 +20,7 @@ #define QUACKLE_DATAMANAGER_H #include +#include #include "playerlist.h" @@ -122,7 +123,8 @@ public: string userDataDirectory() { return m_userDataDirectory; } void seedRandomNumbers(unsigned int seed); - int randomNumber(); + void seedRandomNumbers(seed_seq& seed); + int randomInteger(int low, int high); private: static DataManager *m_self; @@ -144,6 +146,8 @@ private: StrategyParameters *m_strategyParameters; PlayerList m_computerPlayers; + + mt19937_64 m_mersenneTwisterRng; }; inline DataManager *DataManager::self() -- cgit v1.2.3