mercredi 13 décembre 2017

Can anyone help me understand why this implementation of box-muller is so slow in c++?

Why is this implementation of box-muller so slow? It takes 20 minutes to generate 100 million random numbers, but it should be done in seconds?

Note: added function used to generate random numbers between 0 and 1.

std::vector<double> RandomNormalGenerator::BoxMullerMethod(long int N)
{
std::vector<double> result(N);
for (int i = 0; i < N; i+=2)
{
    long int M = result.size();
    double x = 2.0, u1 = 0., u2 = 0.;
    while (x > 1) {
        std::vector<double> runif = _linearCongruentialGenerator.generate_rand_vec(2);
        u1 = 2 * runif[0] - 1;
        u2 = 2 * runif[1] - 1;
        x = u1 * u1 + u2 * u2;
    }
    double y = sqrt(-2 * log(x) / x);
    result[i] = u1 * y;
    result[i + 1] = u2 * y;
}
return result;
}

double LinearCongruentialGenerator::generate_rand()
{
long int q = _m / _magic_prime;
long int r = _m % _magic_prime; 
long int k = _seed / q;
_seed = _magic_prime * (_seed - k * q) - k * r;
if (_seed < 0) _seed = _seed + _m;
auto result = _seed / (double)_m;
return result;
}

std::vector<double> LinearCongruentialGenerator::generate_rand_vec(int size)
{
std::vector<double> result(size);
for (int i = 0; i < size; i++)
{
    result[i] = generate_rand();
}
return result;
}  




Aucun commentaire:

Enregistrer un commentaire