[英]Mersenne twister seed as
我想將隨機數生成器狀態保持為成員變量,因此從此類生成的每個對象都將具有其一個。 每次生成對象時,種子也必須更改。
我做了以下事情,即通過對象的構造器更改種子。 我使用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;
}
}
我正在使用bames53 為C ++類 [[ 播種rand()]中描述的方法苦苦掙扎。
包括這塊
std::mt19937 eng{ std::chrono::high_resolution_clock::now().time_since_epoch().count() };
放入類聲明中會產生以下錯誤:
錯誤:沒有構造函數實例“ std :: merseene_twister_engine <_Ty,_Wx,還有更多東西>參數類型為(std :: chrono :: system_clock :: rep)
現在我不完全知道錯誤來自何處以及如何解決我的問題。 請記住,我或多或少是c ++ newby。 謝謝!
根據您的描述,您可以初始化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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.