我想将随机数生成器状态作为一个成员变量来维护,这样从这个类生成的每个对象都会有一个。每次生成对象时,种子也必须更改。
我做了以下事情,即通过对象的构造函数更改种子。我用 time(NULL) 做的播种但这不够准确,因为对象的创建速度比一秒钟内快得多,哈哈。
#include <iostream>
#include <cmath>
#include<random>
#include<chrono>
#include <ctime>
class Test{
public:
Test();
std::mt19937 rng;
double randomNumber(double min, double max);
};
Test::Test(){
rng.seed(time(NULL));
}
double Test::randomNumber(double min, double max){
std::uniform_real_distribution<double> uniformDistribution(min, max);
return uniformDistribution(rng);
}
int main(){
Test a;
Sleep(1000*1);
Test b;
for (int i = 0; i < 10; i++){
std::cout << "Random number a: " << a.randomNumber(0, 10) << "\tRandom number b: " << b.randomNumber(0, 10) << std::endl;
}
}
我正在努力使用 [ Seeding rand() for a C++ class 中描述的方法由 bames53 提供。
包括这篇文章
std::mt19937 eng{ std::chrono::high_resolution_clock::now().time_since_epoch().count() };
进入类声明会产生以下错误:
错误:构造函数没有实例“std::merseene_twister_engine<_Ty,_Wx, many more things> 参数类型是 (std::chrono::system_clock::rep)
现在我不知道错误从何而来以及如何解决我的问题。请记住,我或多或少是一个 C++ 新手。 谢谢!
最佳答案
根据您的描述,您可以初始化 RNG 一次,然后将其作为对 Test
类的引用传递:
class Test{
public:
Test(std::mt19937& rng): m_rng(rng){
}
std::mt19937& m_rng;
double randomNumber(double min, double max){
std::uniform_real_distribution<double> uniformDistribution(min, max);
return uniformDistribution(m_rng);
}
};
std::mt19937 rng{std::chrono::high_resolution_clock::now().time_since_epoch().count()};
Test a(rng);
因为这个特定的 RNG 有很长的周期,您可以将它实例化一次,然后在所有需要随机数生成的类中从中提取值。
示例用法:
std::mt19937 rng{std::chrono::high_resolution_clock::now().time_since_epoch().count()};
Test a(rng);
Test b(rng);
for(int i=0; i<10; ++i){
std::cout<< "a: " << a.randomNumber(0.0,1.0) << "b: " << b.randomNumber(5.0,6.0) << std::endl;
}
下面是这段代码:http://ideone.com/Lzyp22
关于c++ - 梅森捻线种子作为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26852300/