Генератор случайных чисел rand(3)
использует глобальные переменные состояния (скрытые в реализации (g) libc). Доступ к ним из нескольких потоков приводит к проблемам с кешем, а также не является потокобезопасным. Вы должны использовать вызов rand_r(3)
с параметром seed
, приватным для потока:
long i;
unsigned seed;
#pragma omp parallel private(seed)
{
// Initialise the random number generator with different seed in each thread
// The following constants are chosen arbitrarily... use something more sensible
seed = 25234 + 17*omp_get_thread_num();
#pragma omp for
for (i = 0; i <= 1000000000; i++) {
double x = rand_r(&seed);
}
}
Обратите внимание, что при параллельном запуске будет производиться другой поток случайных чисел, чем при выполнении в последовательном порядке. Я также рекомендовал бы erand48(3)
как лучший (псевдо) случайный номер источника.