Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ MPI中每个进程的随机数_C++_Random_Mpi_Mpich - Fatal编程技术网

C++ MPI中每个进程的随机数

C++ MPI中每个进程的随机数,c++,random,mpi,mpich,C++,Random,Mpi,Mpich,我正在使用MPICH2实现“奇偶”排序。 我做了实现,但当我随机分配到每个进程时, 相同的数字随机分配给所有进程 这是每个进程的代码,每个进程随机分配其值 int main(int argc,char *argv[]) { int nameLen, numProcs, myID; char processorName[MPI_MAX_PROCESSOR_NAME]; int myValue; MPI_Init(&argc,&argv);

我正在使用MPICH2实现“奇偶”排序。 我做了实现,但当我随机分配到每个进程时, 相同的数字随机分配给所有进程

这是每个进程的代码,每个进程随机分配其值

int main(int argc,char *argv[])
{
    int  nameLen, numProcs, myID;
    char processorName[MPI_MAX_PROCESSOR_NAME];
    int myValue;

    MPI_Init(&argc,&argv);
    MPI_Comm_rank(MPI_COMM_WORLD,&myID);
    MPI_Comm_size(MPI_COMM_WORLD,&numProcs);    
    MPI_Get_processor_name(processorName,&nameLen);
    MPI_Status status;

    srand((unsigned)time(NULL));
    myValue = rand()%30+1; 

    cout << "myID: " << myID << " value: " << myValue<<endl;
    MPI_Finalize();

    return 0;
 }


它为每个进程提供了不同的值:)

这项任务并不简单

由于使用
时间(0)
初始化
srand()
,所以得到的数字相同。
time(0)
所做的是返回当前秒(从历元开始)。因此,如果所有进程都具有同步时钟,那么只要它们在同一秒调用
srand()
,所有进程都将使用相同的种子进行初始化,这是很可能的。我甚至在大型机器上也观察到了这一点

解决方案1。使用本地值初始化随机种子。

我所做的是将
cat/proc/meminfo
/dev/random
结合起来计算随机种子的一些内存使用情况包括在计算中,这些内存对物理机器来说比时钟更为本地。请注意,对于1台计算机上的N个任务,此操作仍可能失败。但是如果我没有记错的话,我也使用了
task\u id
。任何本地任务都可以满足。结合材料也是个好主意。毕竟,与实际计算相比,这些计算应该非常短。最好还是安全一点

解决方案2。计算种子作为预处理步骤。


您还可以使用您的方法从
任务0
中生成随机种子,并使用
发送到所有人
进行传播。尽管如此,在进行大规模扩展(如10^5个进程)时,它可能会遇到扩展问题。您还可以使用任何其他方法加载参数,并仅准备种子作为预处理步骤。然而,这也涉及到一些非平凡的工作。

这是因为你的种子变化不够,随机性取决于你的种子

srand

对于srand调用中使用的每个不同种子值 伪随机数生成器可以预期生成不同的 在随后对兰德公司的调用中连续出现结果

编辑:尝试预先生成种子,或为每次
srand
调用手动更改种子

 srand((unsigned)time(NULL));
 srand((unsigned)time(NULL)+myID*numProcs + nameLen);