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%的计算时间将是一个重大进步.
一方面是效率,即速度和大小(状态的字节数),另一方面是任何 RNG 的“随机性”,两者之间总是存在权衡。梅森扭曲器具有相当好的随机性(前提是您使用高熵种子,例如由 提供的std::random_device
),但速度慢且状态较大。std::minstd_rand
或std::knuth_b
(线性同余)更快,ranlux48
(斐波那契)更快,但随机性较低(通过较少的随机性测试,即具有一些非随机谱特性)。只需进行实验并测试您是否对所提供的随机性感到满意(即随机数据中没有意外的相关性)。
编辑:1当然,所有这些 RNG 都不是真正随机的,对于密码学来说也不够随机。如果您需要,请使用std::random_device
,但不要抱怨速度。2并行(您应该考虑)使用thread_local
RNG,每个 RNG 都使用另一个种子进行初始化。
归档时间: |
|
查看次数: |
1744 次 |
最近记录: |