C++ Mersenne Twister seed作为成员变量

C++ Mersenne Twister seed作为成员变量,c++,c++11,member-initialization,C++,C++11,Member Initialization,我想知道如何保持mersenne随机数生成器作为成员变量,并在同一类中使用它 我按照下面的方式编写了这个类,它工作得非常完美,但是我不喜欢std::mt19937被初始化。我想知道在Test的构造函数中是否有初始化它的方法 #include <iostream> #include <cmath> #include <random> #include <chrono> #include <ctime> class Test{ publi

我想知道如何保持mersenne随机数生成器作为成员变量,并在同一类中使用它

我按照下面的方式编写了这个类,它工作得非常完美,但是我不喜欢
std::mt19937
被初始化。我想知道在
Test
的构造函数中是否有初始化它的方法

#include <iostream>
#include <cmath>
#include <random>
#include <chrono>
#include <ctime>

class Test{
public:
    Test()
    {

    }
    void foo()
    {
        auto randomNum = std::uniform_int_distribution<>(0, threads.size())(rnd);
    }

private:
    std::mt19937 rnd
    {
        std::chrono::high_resolution_clock::now().time_since_epoch().count()
    };
}
#包括
#包括
#包括
#包括
#包括
课堂测试{
公众:
测试()
{
}
void foo()
{
auto-randomNum=std::统一分布(0,threads.size())(rnd);
}
私人:
标准::mt19937 rnd
{
std::chrono::高分辨率时钟::now().time\u自\u epoch()以来的时间()计数()
};
}

我认为您对类内初始化的确切功能感到困惑。当你有

struct foo
{
    foo() {}
    int bar = 10;
};
类内初始化只是语法上的糖分

struct foo
{
    foo() : bar(10) {}
    int bar;
};
每当编译器将一个成员添加到成员初始值设定项列表时(当您忘记它或编译器提供构造函数时,就会这样做),它都会使用您在初始化中使用的内容。你的代码是什么

class Test{
public:
    Test()
    {

    }
    void foo()
    {
        auto randomNum = std::uniform_int_distribution<>(0, threads.size())(rnd);
    }

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

在您编写的每个构造函数中,如果您希望为特定构造函数提供其他内容,则始终可以覆盖它。

为什么要这样做?当前代码有什么问题?将初始化移动到构造函数有什么问题?您是否尝试了某项功能,但它不起作用?您是否正在寻找成员初始列表
Test():rnd(seed){…blah…}
。两种方法:第一种是使用构造函数初始值设定项列表初始化变量。这基本上相当于你现在所做的。第二种方法是使用构造函数体中的复制赋值运算符将临时对象复制到
m_random
对象中。@Nathan,它不是重复的@HolyBlackCat Yes。但是如何使用std::mt19937呢?一件小事。您将如何将上述样式的std::random_设备与std::mt19937@TharinduKumara如果您想这样做,那么您将编写一个函数来进行初始化并返回生成器。然后你可以用函数返回的值初始化生成器。@Nathanm,它可以这样使用<代码>测试():rnd(std::random_device{}()){……}@TharinduKumara-Oh-yes。那样做行得通。我还以为你和他们一样在谈论初始化呢
class Test{
public:
    Test() : rnd(std::chrono::high_resolution_clock::now().time_since_epoch().count())
    {

    }
    void foo()
    {
        auto randomNum = std::uniform_int_distribution<>(0, threads.size())(rnd);
    }

private:
    std::mt19937 rnd;
};
rnd(std::chrono::high_resolution_clock::now().time_since_epoch().count())