如何种子随机数发生器?

时间:2016-04-16 10:37:01

标签: c++ c++11 random random-seed

我正在查看在cppreference.com生成正态分布随机数的示例,并对代码进行了重构以获得此结果:

#include <iostream>
#include <random>

struct MyNormalDistribution {
    static double getRandomNumber(double mean,double std_dev){
        return std::normal_distribution<>(mean,std_dev)(MyNormalDistribution::generator);
    }
    private:
        static std::random_device rand;
        static std::mt19937 generator;
};
std::random_device MyNormalDistribution::rand;
std::mt19937 MyNormalDistribution::generator = std::mt19937(MyNormalDistribution::rand());

int main(int argc, char *argv[]) {
    for (int t=0;t<10;t++){
        std::cout << MyNormalDistribution::getRandomNumber(0,10) << std::endl;
    }
}

然而,每当我运行它时,我得到相同的数字序列。是否有一些愚蠢的错误,或者cppreference上的例子不包含适当的播种?

如何正确播种MyNormalDistribution

2 个答案:

答案 0 :(得分:1)

例如,可以使用当前时间为发生器播种:

#include <iostream>
#include <random>

struct MyGenerator {
    std::mt19937 gen;
    static std::random_device rand;
    MyGenerator() : generator(rand()){ gen.seed(time(0)); }
};
std::random_device MyGenerator::rand;
struct MyNormalDistribution {
    static double getRandomNumber(double mean,double std_dev){
        return std::normal_distribution<>(mean,std_dev)(MyNormalDistribution::gen.gen);
    }
    private:
        static MyGenerator gen;
};
MyGenerator MyNormalDistribution::gen;

答案 1 :(得分:1)

正如它在cppreference.com中所写,“问题”在你的std :: random_device中:

  

std :: random_device可以用a来实现   实现定义的伪随机数引擎,如果a   非确定性源(例如硬件设备)不可用   实施。在这种情况下,每个std :: random_device对象都可以   生成相同的数字序列。

换句话说,我认为您正在使用Linux操作系统,并且您没有在内核中设置'CONFIG_HW_RANDOM'选项。或者,您可以使用其他播种值来源,例如系统时钟。

auto seed = std::chrono::system_clock::now().time_since_epoch().count();
std::mt19937 generator {seed};