C++ 中 RNG 的正确副本
Proper copy of RNG in C++
我有一个 class 包含一个 RNG:
class Sampler{
private:
std::random_device rd_;
std::mt19937 gen_;
public:
Sampler();
double sample();
};
class初始化如下:
Sampler::Sampler() :
gen_(rd_())
{}
我的问题是我想在另一个class中使用这个class(成员函数sample()
)但是我不能复制class因为std::random_device
无法复制(删除复制构造函数,否则会生成相同的随机数)。
class Foo{
private:
Sampler s_;
public:
Foo(Sampler);
};
然后:
Foo::Foo(Sampler s) :
s_(s) // does not work
{}
虽然这完全有道理,但我想知道如何实施它才能使其发挥作用。我读过一个机会是构建一个适当的复制构造函数,以便每次制作副本时,它都会播种一个新的种子,但我不知道该怎么做。
您可以只删除 std::random_device
成员变量并在构造 std::mt19937 gen_
时使用临时 std::random_device
,如下所示:
#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.
我有一个 class 包含一个 RNG:
class Sampler{
private:
std::random_device rd_;
std::mt19937 gen_;
public:
Sampler();
double sample();
};
class初始化如下:
Sampler::Sampler() :
gen_(rd_())
{}
我的问题是我想在另一个class中使用这个class(成员函数sample()
)但是我不能复制class因为std::random_device
无法复制(删除复制构造函数,否则会生成相同的随机数)。
class Foo{
private:
Sampler s_;
public:
Foo(Sampler);
};
然后:
Foo::Foo(Sampler s) :
s_(s) // does not work
{}
虽然这完全有道理,但我想知道如何实施它才能使其发挥作用。我读过一个机会是构建一个适当的复制构造函数,以便每次制作副本时,它都会播种一个新的种子,但我不知道该怎么做。
您可以只删除 std::random_device
成员变量并在构造 std::mt19937 gen_
时使用临时 std::random_device
,如下所示:
#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.