优化C++ 11随机生成器的使用

Lia*_*iam 9 c++ random optimization c++11

我正在使用随机数对物理模拟进行大量编码,我只是第一次对我的代码进行了描述,因此我可能在读取输出时出错,但我看到这条线首先出现:

   %   cumulative   self              self     total           
 time   seconds   seconds    calls  ms/call  ms/call  name  
 90.09     21.88    21.88   265536     0.08     0.08  std::mersenne_twister_engine<unsigned long, 32ul, 624ul, 397ul, 31ul, 2567483615ul, 11ul, 4294967295ul, 7ul, 2636928640ul, 15ul, 4022730752ul, 18ul, 1812433253ul>::operator()()
Run Code Online (Sandbox Code Playgroud)

这似乎意味着生成数字生成器占用了90%的时间.我之前已经写过一篇文章,询问是否在每个循环中构建随机概率分布可以节省我的时间,但是在尝试和计时后它没有帮助(定义概率分布是否代价高昂?).是否有优化随机数生成的常用选项?

提前谢谢,我的模拟(在当前状态下)运行了几天,因此减少90%的计算时间将是一个重大进步.

Wal*_*ter 6

一方面是效率,即速度和大小(状态的字节数),另一方面是任何 RNG 的“随机性”,两者之间总是存在权衡。梅森扭曲器具有相当好的随机性(前提是您使用高熵种子,例如由 提供的std::random_device),但速度慢且状态较大。std::minstd_randstd::knuth_b(线性同余)更快,ranlux48(斐波那契)更快,但随机性较低(通过较少的随机性测试,即具有一些非随机谱特性)。只需进行实验并测试您是否对所提供的随机性感到满意(即随机数据中没有意外的相关性)。


编辑:1当然,所有这些 RNG 都不是真正随机的,对于密码学来说也不够随机。如果您需要,请使用std::random_device,但不要抱怨速度。2并行(您应该考虑)使用thread_localRNG,每个 RNG 都使用另一个种子进行初始化。


Wil*_*ert 2

使用专用的随机数库。

我建议WELL512(链接包含论文和源代码)。

  • 是的当然。另一方面,众所周知,Well512 比 mersennetwister 效率高得多,同时提供类似的保证。目前得票最高的答案是“自己实现”——我认为使用专用于手头任务的库是更好的解决方案。 (2认同)