0

我总是画随机数,比如,

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

4

1 回答 1

0

所有伪随机数生成器都会产生最终循环的值序列。一种抽象的观点是,种子相当于循环的入口点。 任何两个不同的种子代表不同的入口点,只要循环长度足够长以至于子序列不重叠,就应该没问题。您最好为 10 个处理器选择 10 个顺序种子值,就像做任何非常花哨的事情一样。例如,以下是用 0、1 和 2 播种 Ruby 的 Mersenne twister 的 10 个值。如您所见,即使种子是按顺序采摘的,它们似乎彼此无关。

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

于 2013-05-31T21:11:19.473 回答