我试图在C ++ 11中使用mean和sigma获得高斯分布。我已成功将Python转换为C ++,但我对初始化随机生成器的方式存有疑问。我是否需要在调用中调用random_device()和mt19937()以获取分发,或者我可以静态调用它们并一直重复使用它们吗?保留代码的成本是多少?
# Python
# random.gauss(mu, sigma)
# Gaussian distribution. mu is the mean, and sigma is the standard deviation.
import random
result = random.gauss(mu, sigma)
// C++11
#include <random>
std::random_device rd;
std::mt19937 e2(rd());
float res = std::normal_distribution<float>(m, s)(e2);
答案 0 :(得分:2)
算法分为两部分:
在您的情况下,e2
是您的统一随机数生成器,给定种子rd
,std::normal_distribution<float>(m, s)
生成一个对象,该对象执行算法的第二部分。
最好的方法是:
// call for the first time (initialization)
std::random_device rd;
std::mt19937 e2(rd());
std::normal_distribution<float> dist(m, s);
// bind the distribution generator and uniform generator
auto gen_gaussian = std::bind(dist, e2);
// call when you need to generate a random number
float gaussian = gen_gaussian();
如果您不关心使用哪个统一随机数生成器,则可以使用std::default_random_engine
代替std:mt19937
。