Вы не упоминаете, какую ОС вы используете, но если это Linux или POSIX-совместимая система, есть erand48()
для поточно-ориентированной генерации случайных чисел, равномерно распределенных в диапазоне [0.0, 1.0)
. Он использует 48-битное начальное число, которое передается в качестве аргумента. Генерация начального семени может быть сделано несколькими способами. OpenBSD и Linux имеют getentropy()
, BSD имеют arc4random_buf()
, вы можете прочитать из специального файла /dev/urandom
во многих ОС или сделать что-то, как вы в настоящее время используя со временем, pid, et c. Я бы рекомендовал таймер с более высоким разрешением, чем time()
, хотя - clock_gettime()
- хороший источник.
Пример:
#include <errno.h>
#include <fcntl.h>
#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
int main(void) {
#pragma omp parallel for
for (int i = 0; i < 4; i++) {
unsigned short xi[3]; // PRNG state variable
#if 0
// OpenBSD 5.6+/Linux kernel 3.17+ and glibc 2.25+
if (getentropy(xi, sizeof xi) < 0) {
perror("getentropy");
exit(EXIT_FAILURE);
}
#else
// Read from /dev/urandom
int fd = open("/dev/urandom", O_RDONLY);
if (fd < 0) {
perror("open /dev/urandom");
exit(EXIT_FAILURE);
}
if (read(fd, xi, sizeof xi) != sizeof xi) {
perror("read");
exit(EXIT_FAILURE);
}
close(fd);
#endif
for (int n = 0; n < 4; n++) {
printf("Thread %d random number %f\n", omp_get_thread_num(), erand48(xi));
}
}
return 0;
}