【发布时间】:2020-02-19 02:55:44
【问题描述】:
我正在尝试编写一个 OpenMP 代码,其中每个线程将处理 0 到 1 之间均匀分布的随机数的大数组。每个线程需要具有不同且独立的随机数分布。此外,每次调用代码时,随机数分布都需要不同。这就是我现在正在使用的。这是否总是保证每个线程都有自己/不同的随机数序列?每次调用代码时序列会有所不同吗?这样做的正确方法是什么?以下代码让每个线程生成 5 个样本,但在实际运行中会达到数百万。
#include <stdio.h>
#include <stdlib.h>
#include <omp.h>
#include <time.h>
int main(int argc, char* argv[])
{
int numthreads,i;
#pragma omp parallel private(i)
{
int id;
id=omp_get_thread_num();
if(id==0) numthreads = omp_get_num_threads();
printf("thread %d \n",id);
srand(time(0)^omp_get_thread_num());
for (i=0; i<5; i++)
{
printf("thread %d: %d %.6f \n",id,i,(double)rand()/(double)RAND_MAX);
}
}
return 0;
}
【问题讨论】:
-
"并且每次调用代码时随机数分布都需要不同。" --> 最终分布会重复。这个要求有多真实?
-
谢谢。任何能提供与 Matlab 的
rand函数类似的性能的东西都可以工作。这就是我使用的参考。 -
time(0)^omp_get_thread_num()只提供UINT_MAX+1不同的分布。如果在接下来的几天内多次调用代码,则可能会少得多 - 可能会重复。 -
代码肯定会连续运行很多天
-
我关心的不是代码运行多长时间。这是程序被调用的频率。如果只有一次,那么您将受制于
rand()、RAND_MAX(可能只有 32767)和rand()状态大小的质量。前面是薄冰,考虑alternatives。
标签: c random openmp random-seed