Random 保存';随机性';并行程序

Random 保存';随机性';并行程序,random,parallel-processing,numerical-methods,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))                      // 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个值,每个值来自于在Ruby的Mersenne twister中植入0、1和2。正如你所看到的,尽管种子是按顺序被采摘的,但它们似乎彼此无关

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

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

种子=2:0.435994021200376 0.025926231827891333 0.5496624778787091 0.4353223926182769 0.42036780208748903 0.3303348210038741 0.2046486340378425 0.6192709663506637 0.29965467367452314
0.26682727510286663

如果你真的担心二的幂,你可以建立一个素数表,然后乘以
素数[processor\u ID]
,但我认为这并不比你目前的方法好。@H2CO3你的意思只是从ID到素数序列的映射?(例如,
int primes[4]={1,3,5,7};
)?是的,除了
1
不是质数。@H2CO3 ha,当然-但它给了我一个唯一的种子-谢谢!Mersenne twister的状态是巨大的,由624个32位整数组成。由于使用特殊算法将32位种子值分布在状态空间上(例如,请参见中的
initialize_generator
),因此使用0和1对其进行种子设定会产生分离良好的状态。另一方面,
rand()
使用状态空间小的简单同余PRNG,并且非常容易关联,因此-素数如H2CO3注释所示。@HristoIliev同意,但具有短周期的生成器无论您做什么,都有重叠子序列的风险。事实上,1980/90年代的许多模拟语言不允许您选择种子,而是将循环划分为k个等长子序列,只允许您指定所需的子序列。当k大约为8或10时,这是非常有限的。谢天谢地,现代的PRNG。由于我没有看到任何关于特定语言或生成器的提及,我的工作假设是zhermes将使用一些体面的东西。