This question already has answers here:
How to generate a random number in C++?
(11个答案)
How to succinctly, portably, and thoroughly seed the mt19937 PRNG?
(8个答案)
2年前关闭。
我正在看在cppreference.com上生成正态分布随机数的示例,并对代码进行了一些重构以实现此目的:
但是,每当运行此命令时,我都会得到相同的数字序列。是否有一些愚蠢的错误,还是cppreference上的示例不包含正确的种子?
如何正确植入
(11个答案)
How to succinctly, portably, and thoroughly seed the mt19937 PRNG?
(8个答案)
2年前关闭。
我正在看在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中:
换句话说,我认为您使用的是Linux OS,并且内核中未设置“CONFIG_HW_RANDOM”选项。或者,您可以仅使用其他种子值源,例如系统时钟。
auto seed = std::chrono::system_clock::now().time_since_epoch().count();
std::mt19937 generator {seed};
07-24 09:34