通常,当我在 C 中播种顺序随机数生成器时,我使用调用
srand(time(NULL))
然后使用
rand() mod N
获得一个介于 0 和 N-1 之间的随机整数。但是,当我并行执行此操作时,对 time(NULL) 的调用彼此非常接近,以至于它们最终成为完全相同的数字。
我尝试使用线性同余随机数生成器:
用于某些整数和。
我知道为一些大整数k选择m=2^k会产生快速的结果,因为模数运算符可以通过截断数字来计算。然而,我发现很难建立产生具有大周期并行随机序列的种子。我知道一个周期长度是最大的,如果
- c 和 m 互为素数
- a-1 能被 m 的所有素因子整除
- 如果 m 是 4 的倍数,则 a-1 也必须是 4 的倍数。
(来源:维基百科)
但是如何确保所有随机数流都具有这个最大属性呢?就 MPI 而言,如何使用线性同余方法合并rank
和size
以产生最大周期?使用滞后 Fibonacci 或 Mersenne Twister 生成更长的并行随机流会更容易吗?