【问题标题】:Mersenne Twister seed as a member variableMersenne Twister 种子作为成员变量
【发布时间】:2017-06-10 20:26:17
【问题描述】:

我想知道如何将梅森随机数生成器保留为成员变量并在同一个类中使用。

我编写了如下的类,它运行良好,但我不喜欢 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()
    };
}

【问题讨论】:

  • 你为什么要这样做?当前代码有什么问题?将初始化移动到构造函数有什么问题?你有没有尝试过,但没有成功?
  • 您在寻找成员初始化列表吗? Test() : rnd(seed) {...blah...}.
  • 两种方式:第一种是使用构造函数初始化列表来初始化变量。这基本上相当于你现在正在做的事情。第二种方法是使用构造函数体内的复制赋值操作符从一个临时对象复制到m_random对象中。
  • @Nathan,这不是重复的
  • @HolyBlackCat 是的。但是你如何使用 std::mt19937 呢?

标签: c++ c++11 member-initialization


【解决方案1】:

我认为您对类中初始化的确切作用感到困惑。当你有

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()};
    };
};

变成

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())

在您编写的每个构造函数中,但如果您想要特定构造函数的其他内容,您始终可以覆盖它。

【讨论】:

  • 一件小事。您将如何以上述风格使用 std::random_device 与 std::mt19937
  • @TharinduKumara 如果你想这样做,那么可以编写一个函数来进行初始化并返回生成器。然后,您可以使用返回的函数初始化生成器。
  • @Nathanm,可以这样使用。 Test() : rnd(std::random_device{}()) {......}.
  • @TharinduKumara 哦,是的。这样就行了。我虽然你在谈论像他们一样初始化它here
猜你喜欢
  • 2017-08-20
  • 2014-02-22
  • 2010-12-19
  • 2014-03-01
  • 2016-02-21
  • 2012-01-13
  • 2016-01-06
  • 2023-03-18
  • 1970-01-01
相关资源
最近更新 更多