我目前正在扩展一个严重依赖随机正态分布数的模拟模型。目前它使用std :: normal_distribution,但速度太慢。
有没有办法实现快速随机正态分布?只要符合正态分布,这些值就不必是唯一的。
答案 0 :(得分:4)
Ziggurat generator by Marsaglia and Tsang (JSS, 2000)已被视为统计上合理且快速。但是你需要修改后的Ziggurat普通生成器,它根据Leong et al (JSS, 2005)的注释使用更好的底层统一生成器。
我有原始论文以及一些评论文章in this GitHub directory,这是R的Ziggurat C ++实现的一部分。
答案 1 :(得分:3)
std::normal_distribution
是一个发行版,而不是一个发行版。您可能想要从标准库中试用其他生成器并查看最快的(参见http://en.cppreference.com/w/cpp/numeric/random)。
如果数字的质量不那么重要,那么你可以回归到非常简单的算法,就像采用r=++i%6
一样简单。
Linear congruential generator也很容易实现(实际上,大多数标准rand()
实现使用了一些实现。但是,它可能不会比使用std::linear_congruential_engine
更快。链接网站还有一些随时可用的随机数生成器。
还有Marsaglia后期的算法,可以找到here并且效率很高w.r.t.性能和数量质量。
最后,确保在测试性能时使用正确的优化标志。
答案 2 :(得分:1)
标准<random>
库允许使用生成器和分布的组合生成随机数。您正在使用正态分布,您想要的是比默认值更快的生成器,看看here。