c++ - 梅森捻线种子作为

标签 c++ random-seed mersenne-twister

我想将随机数生成器状态作为一个成员变量来维护,这样从这个类生成的每个对象都会有一个。每次生成对象时,种子也必须更改。

我做了以下事情,即通过对象的构造函数更改种子。我用 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/

相关文章:

c# - MFC中有没有类似DataGridView的控件

C++ RNG (Mersenne Twister) 需要种子

c++ - [0..1[中的随机实数使用 Mersenne Twister

c++ - 可以内联 std::function 还是我应该使用不同的方法?

C++ 对重载函数的奇怪模棱两可的调用

c++ - 如何使用 C++ 读取 sqlite 数据。?

R:如果加载了插入符号包,则 set.seed() 结果不匹配

python - 使用当前时间戳猜测 python 随机种子

c++ - 使用 Boost.Random 从种子生成多精度整数