我有一个包含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
{}

尽管这完全有意义,但我想知道如何实现此功能才能使其正常工作。我已经读过一个机会,那就是构造一个合适的副本构造函数,这样每次创建副本时,它都会被种子植入新的种子,但是我不知道该怎么做。

最佳答案

您可以删除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

09-06 11:45