/// <summary>Kolejna wartoœæ pseudolosowa o rozk³adzie normalnym /// wyra¿ona jako liczba zmiennoprzecinkowa</summary> /// <param name="mean"> wartoœæ œrednia</param> /// <param name="high"> odchylenie standardowe</param> double RandomGenerator::NextNormal(const double &mean, const double &std) { //Box muller method: https://en.wikipedia.org/wiki/Box%E2%80%93Muller_transform // http://en.literateprograms.org/index.php?title=Special:DownloadCode/Box-Muller_transform_(C)&oldid=7011 /* Metoda generuje dwie liczby o rozk³adzie normalnym. W celu zwiêkszenia efektywnoœci stosuje siê caching nieu¿ytej zmiennej. */ static double n2 = 0.0; static int n2_cached = 0; if (!n2_cached) { double x, y, r; do { x = -2.0*NextDouble(); y = 2.0*NextDouble(); r = x*x + y*y; } while (r == 0.0 || r >= 1.0); double d = sqrt(-2.0*log(r) / r); double n1 = x*d; n2 = y*d; double result = n1*std + mean; n2_cached = 1; return result; } else { n2_cached = 0; return n2*std + mean; } }
//this Generates a double between 0 and 1, and if that double is lower than trueFactor, true is returned bool Randomizer::NextBool(double true_factor) { return NextDouble(0.f, 1.f) <= true_factor; }
float Random::NextFloat() { return (float)NextDouble(); }
/// <summary>Kolejna wartoœæ pseudolosowa o rozk³adzie wyk³adniczym /// wyra¿ona jako liczba zmiennoprzecinkowa</summary> /// <param name="lambda"> wartoœæ lambda</param> double RandomGenerator::NextExp(const double &lambda) { return -log(1 - NextDouble()) * lambda; }
/// <summary>Kolejna wartoœæ pseudolosowa z zakresu [low, high) wyra¿ona jako liczba zmiennoprzecinkowa</summary> /// <param name="low"> wartoœæ minimalna</param> /// <param name="high"> wartoœæ maksymalna</param> double RandomGenerator::NextDouble(double low, double high) { return low + (high - low)*NextDouble(); }