为长分子动力学模拟生成随机数

计算科学 分子动力学 随机数生成
2021-11-24 20:17:15

我用 C++ 编写了一个基本的 2D Langevin 动力学模拟器,用于潜在的粒子,求解方程:

MX¨=U(X)γMX˙+2γkBTMR(t)

这依赖于随机数的来源R(t),并且我一直在使用std::random(特别是 Mersenne Twister RNG)。

我目前的方法是在模拟开始时一次性生成随机数,而不是在每个时间步,因为它(至少对我而言)更快。这对于运行到108时间步长,但最终我用完了 RAM 来存储随机数。

我想至少有能力运行更长的模拟(我正在研究粒子在简单势中的扩散行为),并且想知道什么时候需要注意哪些潜在的陷阱

  • 将模拟分成多个部分,或
  • 将随机数的计算分解成更小的块(比如做一个数字块106脚步。

我注意到的一件事是重复序列的风险 - 请参阅“关于 Langevin 和 Andersen Dynamics 的流行分子动力学软件包中的漏洞”

1个回答

我怀疑动态生成随机数对您来说较慢的原因是由于 Mersenne Twister 的状态相当大。

切换到PCGXorShift+随机数生成器之类的东西会给您带来以下好处:

  1. 更高质量的随机性(Mersenne Twister 未能通过多项随机性测试)
  2. 较小的状态,因此动态生成随机数应该比存储在内存中更快,从而解决您的问题。
  3. 一般速度 - PCG 和 XorShift+ 都比 Mersenne Twister 快 2 倍左右。

至于重复序列,如果您使用 std::seed_seq 正确初始化生成器,则不会发生这种情况。例如,参见PCG C++ 文档