1

我想将随机数生成器状态保持为成员变量,因此从此类生成的每个对象都有其一个。有必要的是,每次生成对象时,种子也会发生变化。

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

包括这件作品

std::mt19937 eng{ std::chrono::high_resolution_clock::now().time_since_epoch().count() };

进入类声明会产生以下错误:

错误:没有构造函数实例“std::merseen_twister_engine<_Ty,_Wx, many more things> 参数类型是 (std::chrono::system_clock::rep)

现在我不完全知道错误来自哪里以及如何解决我的问题。请记住,我或多或少是一个 c++ 新手。谢谢!

4

1 回答 1

1

根据您的描述,您可以初始化一次 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

于 2014-11-10T20:53:41.117 回答