我试图编写一些能够快速计算随机数的东西,并且可以应用于多个线程。我当前的代码是:用于蒙特卡罗集成的线程安全随机数生成
/* Approximating PI using a Monte-Carlo method. */
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <omp.h>
#define N 1000000000 /* As lareg as possible for increased accuracy */
double random_function(void);
int main(void)
{
int i = 0;
double X, Y;
double count_inside_temp = 0.0, count_inside = 0.0;
unsigned int th_id = omp_get_thread_num();
#pragma omp parallel private(i, X, Y) firstprivate(count_inside_temp)
{
srand(th_id);
#pragma omp for schedule(static)
for (i = 0; i <= N; i++) {
X = 2.0 * random_function() - 1.0;
Y = 2.0 * random_function() - 1.0;
if ((X * X) + (Y * Y) < 1.0) {
count_inside_temp += 1.0;
}
}
#pragma omp atomic
count_inside += count_inside_temp;
}
printf("Approximation to PI is = %.10lf\n", (count_inside * 4.0)/ N);
return 0;
}
double random_function(void)
{
return ((double) rand()/(double) RAND_MAX);
}
这工作,但通过观察我知道它不是使用的所有线程的资源管理器。 rand()是否适用于多线程代码?如果不是,有没有一个好的选择?非常感谢。 Jack
Ladd's实现的链接已经死机,有关fortran实现的其他建议? – lalmei 2014-09-05 11:03:59