summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Fultz <jfultz@wolfram.com>2019-01-14 04:40:55 -0600
committerJohn Fultz <jfultz@wolfram.com>2019-01-14 04:40:55 -0600
commitb2a056e91ef73892532cc4ea5d694ec226f4db8f (patch)
tree207834b24cd6297ec472781aebdafd63d0ff766f
parent0ec9a95998fddbccac464a96b457d28f30587dca (diff)
Resolve #75, update RNG to Mersenne-Twister.
-rw-r--r--bag.cpp2
-rw-r--r--datamanager.cpp15
-rw-r--r--datamanager.h6
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 <string>
+#include <random>
#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()