这是我的看法:
#include <boost/random/normal_distribution.hpp>
#include <boost/random.hpp>
int main()
{
boost::mt19937 gen(42); // seed it once
boost::normal_distribution<double> nd(0.0, 1.0);
boost::variate_generator<boost::mt19937&, boost::normal_distribution<double> > randNormal(gen, nd);
std::vector<double> data(100000, 0.0), nsyData;
nsyData.reserve(data.size());
double sd = 415*randNormal();
std::transform(data.begin(), data.end(), std::back_inserter(nsyData),
[sd,&randNormal](double data) { return data + sd*randNormal(); });
}
请注意,您在循环的每次迭代中都在播种 mersenne twister。恐怕这完全破坏了生成的随机数的任何质量保证。给你的发电机播种一次。 (显然,如果您需要它是非确定性的,请使用不同的种子,例如来自 random_device 的种子)。
看到这个Live On Coliru
更新在 cmets 中来回折腾后,这是一个 c++03 版本,实际上应该不会太糟糕,同时仍然可以理解:
#include <boost/random/normal_distribution.hpp>
#include <boost/random.hpp>
#include <boost/bind.hpp>
struct Xfrm {
typedef double result_type;
template <typename Gen>
double operator()(double sd, Gen& randNormal, double data) const {
return data + sd*randNormal();
}
};
int main()
{
boost::mt19937 gen(42); // seed it once
boost::normal_distribution<double> nd(0.0, 1.0);
boost::variate_generator<boost::mt19937&, boost::normal_distribution<double> > randNormal(gen, nd);
std::vector<double> data(100000, 0.0), nsyData;
nsyData.reserve(data.size());
double sd = 415*randNormal();
std::transform(data.begin(), data.end(), std::back_inserter(nsyData),
boost::bind(Xfrm(), sd, boost::ref(randNormal), ::_1));
}