我正在尝试在visual studio C ++ 2010中进行高斯分布。我希望每次运行时都会得到不同的结果。但是,当我运行此代码三次时,结果是相同的:
#include <iostream>
#include <random>
int roundnew(double d)
{
return floor(d + 0.5);
}
int main()
{
std::default_random_engine generator;
std::normal_distribution<double> distribution(10,1);
for (int n = 0; n < 12; ++n) {
printf("%d\n",roundnew(distribution(generator)));
}
return 0;
}
结果是
10
9
11
9
10
11
10
9
10
10
12
10
我的代码有什么问题?它在我的代码中需要种子值,对吧?您可以在run code
看到结果答案 0 :(得分:4)
您需要为随机数生成器播种。
做这样的事情:
std::random_device rd;
std::default_random_engine generator;
generator.seed( rd() ); //Now this is seeded differently each time.
std::normal_distribution<double> distribution(10,1);
for (int n = 0; n < 12; ++n) {
{
printf("%d\n",roundnew(distribution(generator)));
}
std::random_device
应该生成非确定性数字,因此它应该对您的播种目的有利。每个程序运行都应该为您的RNG创建不同的种子。请参阅:http://en.cppreference.com/w/cpp/numeric/random/random_device
(正如R. Martinho Fernandes所指出的那样,在这方面缺乏一些实现,所以如果你正在做一些重要的事情,请检查实现细节。)
有关c ++随机数生成的更多详细信息,请参阅:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3551.pdf