51 const uint64_t t = this->
state[1] << 17;
79 static inline uint64_t
rotl64(
const uint64_t x,
const int k) {
80 return (x << k) | (x >> (64 - k));
84 uint64_t z = (
seed + 0x9e3779b97f4a7c15);
85 z = (z ^ (z >> 30)) * 0xbf58476d1ce4e5b9;
86 z = (z ^ (z >> 27)) * 0x94d049bb133111eb;
115 static void initRand(
SumoRNG* which =
nullptr,
const bool random =
false,
const int seed = 23423);
125 return maxV *
rand(rng);
129 static inline double rand(
double minV,
double maxV,
SumoRNG* rng =
nullptr) {
130 return minV + (maxV - minV) *
rand(rng);
135 if (rng ==
nullptr) {
138 unsigned int usedBits = maxV - 1;
139 usedBits |= usedBits >> 1;
140 usedBits |= usedBits >> 2;
141 usedBits |= usedBits >> 4;
142 usedBits |= usedBits >> 8;
143 usedBits |= usedBits >> 16;
148 result = (*rng)() & usedBits;
150 }
while (result >= maxV);
155 static inline int rand(
int minV,
int maxV,
SumoRNG* rng =
nullptr) {
156 return minV +
rand(maxV - minV, rng);
160 static inline long long int rand(
long long int maxV,
SumoRNG* rng =
nullptr) {
161 if (maxV <= std::numeric_limits<int>::max()) {
162 return rand((
int)maxV, rng);
164 if (rng ==
nullptr) {
167 unsigned long long int usedBits = maxV - 1;
168 usedBits |= usedBits >> 1;
169 usedBits |= usedBits >> 2;
170 usedBits |= usedBits >> 4;
171 usedBits |= usedBits >> 8;
172 usedBits |= usedBits >> 16;
173 usedBits |= usedBits >> 32;
176 long long int result;
178 result = (((
unsigned long long int)(*rng)() << 32) | (*rng)()) & usedBits;
180 }
while (result >= maxV);
185 static inline long long int rand(
long long int minV,
long long int maxV,
SumoRNG* rng =
nullptr) {
186 return minV +
rand(maxV - minV, rng);
190 static double randNorm(
double mean,
double variance,
SumoRNG* rng =
nullptr);
197 static inline const T&
199 assert(v.size() > 0);
200 return v[
rand((
int)v.size(), rng)];
205 if (rng ==
nullptr) {
208 std::ostringstream oss;
209 if (rng->count < 1000000) {
219 if (rng ==
nullptr) {
222 std::istringstream iss(state);
223 if (state.size() < 10) {
225 rng->discard(rng->count);
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 double randExp(double rate, SumoRNG *rng=nullptr)
Access to a random number from an exponential distribution.
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 double rand(SumoRNG *rng=nullptr)
Returns a random real number in [0, 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 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 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.
SumoRNG(const std::string &_id)
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)