1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| GaussianRandomizer::GaussianRandomizer(float sigma, float mean)
{
if(sigma<0)
throw Millie::IllegalArgument("GaussianRandomizer");
_sqrt =sigma;
_mean = mean;
srand(time(0));
}
float GaussianRandomizer::get()
{
int i1 = (rand() % 65000) + 1 ; //génère un entier entre 1 et 65000 (selon une distribution uniforme)
int i2 = (rand() % 65000) + 1 ;
/*on génère un réel aléatoire entre 0 et 1 strictement*/
float u1 = static_cast<float>(i1) / 65001.0f; /*u1>0 et <1 strictement*/
float u2 = static_cast<float>(i2) / 65001.0f;
/*box muller*/
return (sqrt(-2.0f * log(u1)) * cos( 2.0f * M_PI * u2) * _sqrt + _mean);
} |
Partager