快速随机正态分布发生器

时间:2014-06-05 14:06:01

标签: c++ random normal-distribution

我目前正在扩展一个严重依赖随机正态分布数的模拟模型。目前它使用std :: normal_distribution,但速度太慢。

有没有办法实现快速随机正态分布?只要符合正态分布,这些值就不必是唯一的。

3 个答案:

答案 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