簡體   English   中英

梅森捻轉種子為

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM