3 #include <geneial/utility/Random.h>
18 geneial_private_namespace(geneial)
20 geneial_private_namespace(utility)
24 inline int mymod(
int k,
const int n)
26 return ((k %= n) < 0) ? k + n : k;
29 geneial_export_namespace
33 inline int Random::generate(
const int min,
const int max)
40 sign *= -(rand() % 2);
42 const int result = mymod(sign * rand(), (max - min + 1)) + min;
49 inline unsigned int Random::generate(
const unsigned int min,
const unsigned int max)
53 const unsigned int result = mymod(rand(), (max - min + 1)) + min;
58 inline int Random::generate()
65 inline double Random::generate(
const double min,
const double max)
72 sign *= -(rand() % 2);
74 const double range = (max - min);
75 const double div = RAND_MAX / range;
76 const double random = min + (rand() / div);
83 inline double Random::generate()
86 return Random::generate<double>(std::numeric_limits<double>::min(), std::numeric_limits<double>::max());
90 inline float Random::generate(
const float min,
const float max)
94 const float range = (max - min);
95 const float div = ((float) RAND_MAX) / range;
96 const float random = min + (((float) rand()) / div);
101 inline float Random::generate()
104 return Random::generate(std::numeric_limits<float>::min(), std::numeric_limits<float>::max());
108 bool Random::generateBit()
114 bool Random::decision(
const double probability)
117 assert(0.0 <= probability);
118 assert(1.0 >= probability);
119 const double reference = generate<double>(0.0, 1.0);
120 if (probability == 0.0)
126 return reference <= probability;
130 inline void Random::initialize()
132 srand(static_cast<unsigned>(time(0)));