在并行程序中保留“随机性”

时间:2013-05-31 19:40:09

标签: random parallel-processing numerical-methods

我总是抽出像

这样的随机数字
srand(time(NULL))                      // seed with current time
...
double rnum = 1.0*rand()/RAND_MAX;     // convert to [0.0,1.0]

我从来没有遇到任何问题。我目前正在运行多达数百个内核的并行代码,它们似乎具有相同的“随机”数字系列,大概是因为它们都是在同一时间(或非常相似的时间)开始的。

在处理器之间进行随机化的好方法是什么?

我可以访问每个处理器的ID,所以我在考虑使用像

这样的东西
srand(time(NULL)*(pG->my_id+1))        // +1 incase my_id == 0

但我不确切知道播种是如何起作用的 - 所以我有点担心整数乘数(特别是因子2?)不是“随机”(注意:我没有足够随机的具体标准)

1 个答案:

答案 0 :(得分:0)

所有伪随机数生成器都会生成最终循环的值序列。一个抽象的观点是种子相当于进入循环的入口点。 任何两个不同的种子代表不同的入口点,只要周期长度足够长以使子序列不重叠,它就应该没问题。您也可以为10个处理器选择10个连续的种子值,以便做任何非常奇特的事情。例如,这里有10个值来自播种Ruby的Mersenne twister 0,1和2.你可以看到,它们似乎没有任何关系,即使种子是按顺序采摘的。

seed = 0: 0.5488135039273248 0.7151893663724195 0.6027633760716439 0.5448831829968969 0.4236547993389047 0.6458941130666561 0.4375872112626925 0.8917730007820798 0.9636627605010293 0.3834415188257777

seed = 1:0.417022004702574 0.7203244934421581 0.00011437481734488664 0.30233257263183977 0.14675589081711304 0.0923385947687978 0.1862602113776709 0.34556072704304774 0.39676747423066994 0.538816734003357

seed = 2:0.43599490214200376 0.025926231827891333 0.5496624778787091 0.4353223926182769 0.42036780208748903 0.3303348210038741 0.2046486340378425 0.6192709663506637 0.29965467367452314 0.26682727510286663