user2771738
user2771738

Reputation: 951

C++ with OpenMP thread safe random numbers

I am trying to draw some random points, and then calculate smth with them. I am using few threads, but my random is not so random as it supposed to be... I mean when I am using rand() I gets correct answer, but very slow(because of static rand), so I am using rand_r with seed, but the answer of my program is always wird.

double randomNumber(unsigned int seed, double a, double b) {
    return a + ((float)rand_r(&seed))/(float)(RAND_MAX) * (b-a);
}

my program:

#pragma omp parallel
for(int i = 0; i < points; i++){
    seedX = (i+1) * time(NULL);
    seedY = (points - i) * time(NULL);

    punkt.x = randomNumber(seedX, minX, maxX);
    punkt.y = randomNumber(seedY, minY, maxY);
...
}

I found some solution in other topics(some mt19937 generators etc), but i cant compile anything.

I am using g++ -fopenmp for compiling.(g++ (Ubuntu 4.8.2-19ubuntu1) 4.8.2)

edit:

seed = rand();
#pragma omp parallel
for(int i = 0; i < points; i++){


    punkt.x = randomNumber(seed, minX, maxX);
    punkt.y = randomNumber(seed, minY, maxY);
...
}

Upvotes: 0

Views: 824

Answers (2)

didiz
didiz

Reputation: 1099

I believe that others are trying to say is, seed one in constructor with srand(some number), then do not seed anymore.

class someRandomNumber {

}

Upvotes: 0

Bathsheba
Bathsheba

Reputation: 234785

Re-seeding your generators within each iteration of the for loop is going to ruin their statistical properties.

Also, it's likely that you'll introduce correlation between your x and y values if you extract them using two linear congruential generators.

Keep it simple; use one generator, and one seed.

Going forward, I'd recommend you use mt19937 as it will have better properties still. Linear congruential generators can fail a chi squared test for autocorrelation which is particularly important if you are using it for an x, y plot.

Upvotes: 1

Related Questions