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

我总是绘制像随机数字,

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倍),而不是“足够随机”(注意:我没有足够随机的具体标准)。


所有的伪随机数发生器产生最终循环的值序列。 一个抽象的观点是种子等同于进入循环的入口点。 任何两个不同的种子代表不同的入口点,并且只要周期长度足够长以致子序列不重叠就应该是好的。 你也可以为10个处理器选择10个连续的种子值,以做任何特别的事情。 例如,这里有10个值,分别是从0,1和2播种红宝石的Mersenne捻线人。正如你所看到的,即使种子是依次选取的,它们看起来与彼此没有任何关系。

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

链接地址: http://www.djcxy.com/p/68031.html

上一篇: Preserve 'randomness' in parallel programs

下一篇: A parallel monad map in Haskell? Something like parMapM?