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