如何为并行进程正确选择rng种子

Jor*_*tao 8 c c++ random parallel-processing

我正在开发一个C/C++项目,我正在使用随机数生成器(gslboost).整个想法可以简化为一个非平凡的随机过程,它接收种子并返回结果.我正在计算流程的不同实现的平均值.

因此,种子很重要:过程必须使用不同的种子,否则会偏向平均值.

到目前为止,我正在使用time(NULL)种子.但是,如果两个进程在同一秒开始,则种子是相同的.这是因为我正在使用并行化(使用openMP).

所以,我的问题是:如何在C/C++上实现一个"种子赋予者",它可以提供独立的种子?

举例来说,我虽然在使用的线程数,( ).thread_num seed = time(NULL)*thread_num然而,这意味着种子是相关的:它们是彼此的多个.这会对"伪随机"造成任何问题,还是与顺序种子一样好?

要求是它必须适用于Mac OS(我的电脑)和类似于OS Cent(集群)的Linux发行版(并且自然地给出了独立的实现).

ffe*_*tte 7

对此通常使用的方案是具有用于为每个特定于过程的RNG生成种子的"主"RNG.

这种方案的优点是整个计算只由一个种子决定,你可以在某处记录,以便能够重放任何模拟(这可能对调试令人讨厌的错误很有用).


Gea*_*phy 5

我们在Beowulf计算网格上遇到了类似的问题,我们使用的解决方案是将流程的pid合并到RNG种子中,如下所示:

time(NULL)*thread_num*getpid()
Run Code Online (Sandbox Code Playgroud)

当然,您可以从/ dev/urandom或/ dev/random读取整数.