【发布时间】:2021-09-07 23:57:03
【问题描述】:
我正在尝试使用类似于 Python 的 Numpy random number generator 的 API 来实现生成高斯(又名正常)随机浮点数的 C++ 类:
numpy.random.normal(loc, scale)
其中loc 是平均值,scale 是标准差。
以下是我的尝试。
#include <cstdio>
#include <random>
#include <ctime>
class Gaussian
{
std::default_random_engine gen;
public:
Gaussian()
{
srand((unsigned int)time(NULL));
}
double get(double mean, double std)
{
std::normal_distribution<double> nd(mean, std);
return nd(gen);
}
};
问题在于,在我的main() 函数中,我生成了 10 个随机双精度数,并且顺序始终相同。我在 Mac 上使用 g++。
int main(int argc, char**argv)
{
srand((unsigned int)time(NULL));
Gaussian g;
int N = 10;
double mean = 50.0;
double std = 2.0;
for (int i = 0; i < N; i++) {
double value = g.get(mean, std);
printf("%f\n", value);
}
}
// Compile: g++ main.cpp
一致地产生多次调用:
47.520528
53.224019
52.765603
48.191707
46.679143
50.151444
50.194442
49.542437
51.169795
51.069510
发生了什么事?
【问题讨论】:
-
我认为你不会通过调用
srand来播种std::default_random_engine(假设一个是C++,另一个是C),但我可能弄错了。我认为这只影响rand。您可能想要使用std::random_device r;和std::default_random_engine gen(r()),或者您可以使用gen.seed(time(NULL))进行C 风格播种