无法使用种子生成高斯分布

use*_*103 4 c++ random visual-studio-2010 c++11

我正在尝试在 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;
}
Run Code Online (Sandbox Code Playgroud)

结果是

10
9
11
9
10
11
10
9
10
10
12
10
Run Code Online (Sandbox Code Playgroud)

我的代码有什么问题?我的代码中需要种子值,对吧?运行代码即可看到结果

shu*_*e87 5

您需要为随机数生成器播种。

做这样的事情:

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)));
}
Run Code Online (Sandbox Code Playgroud)

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