c++ - 如何播种随机数生成器?

标签 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

最佳答案

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

std::random_device may be implemented in terms of an implementation-defined pseudo-random number engine if a non-deterministic source (e.g. a hardware device) is not available to the implementation. In this case each std::random_device object may generate the same number sequence.

换句话说,我认为您使用的是 Linux 操作系统,并且您的内核中没有设置“CONFIG_HW_RANDOM”选项。作为替代方案,您可以只使用另一个种子值来源,例如系统时钟。

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

关于c++ - 如何播种随机数生成器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36663027/

相关文章:

c++ - 这个 C++ 代码会一直按我的预期工作,还是不能保证执行顺序?

javascript - 只使用一次数组元素

c++ - C++标准中哪里声明删除复制构造函数时不生成默认构造函数?

html - 从一个 URL 获取不同的图像

Java - 最高效的随机访问多线程列表

C++ 数据存储替代 Python pickle

c++ - free.c 抛出异常 "this program has stopped working"

c++ - 有没有办法从 python 编译 c/c++ 程序?

C++ 调试断言失败,表达式 : _BLOCK_TYPE_IS_VALID(pHead - blockUse )

c++ - 使用 SFINAE 根据类模板参数的类型更改类中调用的函数