52 const uint64_t t = this->
state[1] << 17;
80 static inline uint64_t
rotl64(
const uint64_t x,
const int k) {
81 return (x << k) | (x >> (64 - k));
85 uint64_t z = (
seed + 0x9e3779b97f4a7c15);
86 z = (z ^ (z >> 30)) * 0xbf58476d1ce4e5b9;
87 z = (z ^ (z >> 27)) * 0x94d049bb133111eb;
99 unsigned long long int count = 0;
113 static void initRand(
SumoRNG* which =
nullptr,
const bool random =
false,
const int seed = 23423);
120 if (rng ==
nullptr) {
123 const double res = double((*rng)() / 4294967296.0);
125 #ifdef DEBUG_RANDCALLS
126 if (rng->count == myDebugIndex) {
127 std::cout <<
"DEBUG\n";
129 std::stringstream stream;
130 stream <<
" rng" << myRngId.find(rng)->second <<
" rand call=" << rng->count <<
" val=" << res <<
"\n";
131 std::cout << stream.str();
138 return maxV *
rand(rng);
142 static inline double rand(
double minV,
double maxV,
SumoRNG* rng =
nullptr) {
143 return minV + (maxV - minV) *
rand(rng);
148 if (rng ==
nullptr) {
151 unsigned int usedBits = maxV - 1;
152 usedBits |= usedBits >> 1;
153 usedBits |= usedBits >> 2;
154 usedBits |= usedBits >> 4;
155 usedBits |= usedBits >> 8;
156 usedBits |= usedBits >> 16;
161 result = (*rng)() & usedBits;
163 }
while (result >= maxV);
168 static inline int rand(
int minV,
int maxV,
SumoRNG* rng =
nullptr) {
169 return minV +
rand(maxV - minV, rng);
173 static inline long long int rand(
long long int maxV,
SumoRNG* rng =
nullptr) {
174 if (maxV <= std::numeric_limits<int>::max()) {
175 return rand((
int)maxV, rng);
177 if (rng ==
nullptr) {
180 unsigned long long int usedBits = maxV - 1;
181 usedBits |= usedBits >> 1;
182 usedBits |= usedBits >> 2;
183 usedBits |= usedBits >> 4;
184 usedBits |= usedBits >> 8;
185 usedBits |= usedBits >> 16;
186 usedBits |= usedBits >> 32;
189 long long int result;
191 result = (((
unsigned long long int)(*rng)() << 32) | (*rng)()) & usedBits;
193 }
while (result >= maxV);
198 static inline long long int rand(
long long int minV,
long long int maxV,
SumoRNG* rng =
nullptr) {
199 return minV +
rand(maxV - minV, rng);
203 static double randNorm(
double mean,
double variance,
SumoRNG* rng =
nullptr);
207 static inline const T&
209 assert(v.size() > 0);
210 return v[
rand((
int)v.size(), rng)];
215 if (rng ==
nullptr) {
218 std::ostringstream oss;
219 if (rng->count < 1000000) {
229 if (rng ==
nullptr) {
232 std::istringstream iss(state);
233 if (state.size() < 10) {
235 rng->discard(rng->count);
246 #ifdef DEBUG_RANDCALLS
247 static std::map<SumoRNG*, int> myRngId;
248 static int myDebugIndex;
Utility functions for using a global, resetable random number generator.
static SumoRNG myRandomNumberGenerator
the default random number generator to use
static void loadState(const std::string &state, SumoRNG *rng=nullptr)
load rng state from string
static const T & getRandomFrom(const std::vector< T > &v, SumoRNG *rng=nullptr)
Returns a random element from the given vector.
static long long int rand(long long int minV, long long int maxV, SumoRNG *rng=nullptr)
Returns a random 64 bit integer in [minV, maxV-1].
static double rand(double minV, double maxV, SumoRNG *rng=nullptr)
Returns a random real number in [minV, maxV)
static void initRand(SumoRNG *which=nullptr, const bool random=false, const int seed=23423)
Initialises the random number generator with hardware randomness or seed.
static int rand(int minV, int maxV, SumoRNG *rng=nullptr)
Returns a random integer in [minV, maxV-1].
static int rand(int maxV, SumoRNG *rng=nullptr)
Returns a random integer in [0, maxV-1].
static double randNorm(double mean, double variance, SumoRNG *rng=nullptr)
Access to a random number from a normal distribution.
static void insertRandOptions()
Initialises the given options container with random number options.
static std::string saveState(SumoRNG *rng=nullptr)
save rng state to string
static double rand(double maxV, SumoRNG *rng=nullptr)
Returns a random real number in [0, maxV)
static double rand(SumoRNG *rng=nullptr)
Returns a random real number in [0, 1)
static long long int rand(long long int maxV, SumoRNG *rng=nullptr)
Returns a random 64 bit integer in [0, maxV-1].
static void initRandGlobal(SumoRNG *which=nullptr)
Reads the given random number options and initialises the random number generator in accordance.
unsigned long long int count
A random number generator as proposed here https://prng.di.unimi.it/xoshiro256plusplus....
friend std::ostream & operator<<(std::ostream &os, const XoShiRo256PlusPlus &r)
friend std::istream & operator>>(std::istream &is, XoShiRo256PlusPlus &r)
void discard(unsigned long long skip)
static uint64_t rotl64(const uint64_t x, const int k)
void seed(const uint64_t seed)
static uint64_t splitmix64(const uint64_t seed)