55 static void initRand(std::mt19937* which = 0,
const bool random =
false,
const int seed = 23423);
61 static inline double rand(std::mt19937* rng = 0) {
65 const double res = double((*rng)() / 4294967296.0);
66 #ifdef DEBUG_RANDCALLS 69 std::cout <<
"DEBUG\n";
71 std::cout <<
" rand call=" <<
myCallCount <<
" val=" << res <<
"\n";
77 static inline double rand(
double maxV, std::mt19937* rng = 0) {
78 return maxV *
rand(rng);
82 static inline double rand(
double minV,
double maxV, std::mt19937* rng = 0) {
83 return minV + (maxV - minV) *
rand(rng);
87 static inline int rand(
int maxV, std::mt19937* rng = 0) {
91 unsigned int usedBits = maxV - 1;
92 usedBits |= usedBits >> 1;
93 usedBits |= usedBits >> 2;
94 usedBits |= usedBits >> 4;
95 usedBits |= usedBits >> 8;
96 usedBits |= usedBits >> 16;
101 result = (*rng)() & usedBits;
102 }
while (result >= maxV);
107 static inline int rand(
int minV,
int maxV, std::mt19937* rng = 0) {
108 return minV +
rand(maxV - minV, rng);
112 static inline long long int rand(
long long int maxV, std::mt19937* rng = 0) {
113 if (maxV <= std::numeric_limits<int>::max()) {
114 return rand((
int)maxV, rng);
119 unsigned long long int usedBits = maxV - 1;
120 usedBits |= usedBits >> 1;
121 usedBits |= usedBits >> 2;
122 usedBits |= usedBits >> 4;
123 usedBits |= usedBits >> 8;
124 usedBits |= usedBits >> 16;
125 usedBits |= usedBits >> 32;
128 long long int result;
130 result = (((
unsigned long long int)(*rng)() << 32) | (*rng)()) & usedBits;
131 }
while (result >= maxV);
136 static inline long long int rand(
long long int minV,
long long int maxV, std::mt19937* rng = 0) {
137 return minV +
rand(maxV - minV, rng);
141 static inline double randNorm(
double mean,
double variance, std::mt19937* rng = 0) {
145 u =
rand(2.0, rng) - 1;
146 const double v =
rand(2.0, rng) - 1;
148 }
while (q == 0.0 || q >= 1.0);
149 return (
double)(mean + variance * u * sqrt(-2 * log(q) / q));
154 static inline const T&
156 assert(v.size() > 0);
157 return v[
rand((
int)v.size(), rng)];
165 std::ostringstream oss;
171 static void loadState(
const std::string& state, std::mt19937* rng = 0) {
175 std::istringstream iss(state);
static std::string saveState(std::mt19937 *rng=0)
save rng state to string
static double rand(double minV, double maxV, std::mt19937 *rng=0)
Returns a random real number in [minV, maxV)
static void insertRandOptions()
Initialises the given options container with random number options.
static double rand(double maxV, std::mt19937 *rng=0)
Returns a random real number in [0, maxV)
static double rand(std::mt19937 *rng=0)
Returns a random real number in [0, 1)
static int rand(int minV, int maxV, std::mt19937 *rng=0)
Returns a random integer in [minV, maxV-1].
static int myCallCount
only used for debugging;
static long long int rand(long long int maxV, std::mt19937 *rng=0)
Returns a random 64 bit integer in [0, maxV-1].
Utility functions for using a global, resetable random number generator.
static int rand(int maxV, std::mt19937 *rng=0)
Returns a random integer in [0, maxV-1].
static double randNorm(double mean, double variance, std::mt19937 *rng=0)
Access to a random number from a normal distribution.
static long long int rand(long long int minV, long long int maxV, std::mt19937 *rng=0)
Returns a random 64 bit integer in [minV, maxV-1].
static std::mt19937 myRandomNumberGenerator
the random number generator to use
static void initRand(std::mt19937 *which=0, const bool random=false, const int seed=23423)
Initialises the random number generator with hardware randomness or seed.
static const T & getRandomFrom(const std::vector< T > &v, std::mt19937 *rng=0)
Returns a random element from the given vector.
A storage for options typed value containers)
static void initRandGlobal(std::mt19937 *which=0)
Reads the given random number options and initialises the random number generator in accordance...
static void loadState(const std::string &state, std::mt19937 *rng=0)
load rng state from string