在C ++中正确复制RNG

时间:2017-02-02 09:22:08

标签: c++ random copy-constructor mersenne-twister

我有一个包含RNG的课程:

class Sampler{    
private:
    std::random_device rd_;
    std::mt19937 gen_;

public:
    Sampler();
    double sample();
};

该类初始化如下:

Sampler::Sampler() :
                   gen_(rd_())
{}

我的问题是我想在另一个类中使用这个类(成员函数sample())但我无法复制该类,因为std::random_device无法复制(复制构造函数被删除,否则将生成相同的随机数)。

class Foo{
private:
    Sampler s_;

public:
    Foo(Sampler);

};

然后:

Foo::Foo(Sampler s) :
        s_(s) // does not work
{}

虽然这很有意义,但我想知道如何实现这一点才能使其发挥作用。我已经读过一个机会就是构建一个合适的拷贝构造函数,这样每次制作一个副本时,它都会被一个新的种子播种,但我不知道如何做到这一点。

1 个答案:

答案 0 :(得分:1)

您可以在构建std::random_device时删除std::random_device成员变量并使用临时std::mt19937 gen_,如下所示:

#include <iostream>
#include <random>

class Sampler{    
private:
    std::mt19937 gen_;

public:
    Sampler();
    double sample();
};

Sampler::Sampler() : gen_(std::random_device{}()) {}

class Foo{
private:
    Sampler s_;

public:
    Foo(Sampler);
};

Foo::Foo(Sampler s) : s_(s) {} // Does work

试试here