我试图绘制一些随机点,然后用它们计算smth。我使用的线程很少,但我的随机并不是那么随机,因为它应该是......我的意思是当我使用rand()时我得到了正确的答案,但是很慢(因为静态兰特),所以我使用的是rand_r有种子,但我的计划的答案总是很糟糕。
double randomNumber(unsigned int seed, double a, double b) {
return a + ((float)rand_r(&seed))/(float)(RAND_MAX) * (b-a);
}
我的节目:
#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);
...
}
我在其他主题(一些mt19937生成器等)中找到了一些解决方案,但我无法编译任何东西。
我正在使用g ++ -fopenmp进行编译。(g ++(Ubuntu 4.8.2-19ubuntu1)4.8.2)
修改
seed = rand();
#pragma omp parallel
for(int i = 0; i < points; i++){
punkt.x = randomNumber(seed, minX, maxX);
punkt.y = randomNumber(seed, minY, maxY);
...
}
答案 0 :(得分:1)
在for
循环的每次迭代中重新播种您的生成器将破坏其统计属性。
此外,如果使用两个线性同余生成器提取它们,您可能会在x和y值之间引入相关性。
保持简单;使用一个发电机和一个种子。
展望未来,我建议您使用mt19937,因为它仍然会有更好的属性。线性同余生成器可能无法通过卡方检验进行自相关,如果将其用于x,y图,这一点尤其重要。
答案 1 :(得分:0)
我相信其他人试图说的是,使用srand(some number)
在构造函数中播种一个,然后不再播种。
class someRandomNumber {
}