/// <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;
	}
}
Exemplo n.º 2
0
//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;
}
Exemplo n.º 3
0
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();
}