C++ 以C+格式正确复制RNG+;
我有一个包含RNG的类:C++ 以C+格式正确复制RNG+;,c++,random,copy-constructor,mersenne-twister,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()),但我无法复制该类
class Sampler{
private:
std::random_device rd_;
std::mt19937 gen_;
public:
Sampler();
double sample();
};
该类的初始化如下所示:
Sampler::Sampler() :
gen_(rd_())
{}
我的问题是我想在另一个类中使用这个类(成员函数sample()
),但我无法复制该类,因为无法复制std::random\u device
(复制构造函数被删除,否则会生成相同的随机数)
然后:
Foo::Foo(Sampler s) :
s_(s) // does not work
{}
虽然这完全有道理,但我想知道如何实现这一点,以使其发挥作用。我曾经读到过这样一个机会,那就是构造一个合适的拷贝构造函数,这样每次拷贝都会有一个新的种子,但我不知道怎么做 在构造
std::mt19937 gen\时,您可以删除std::random\ u device
成员变量并使用临时std::random\ u 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
#包括
#包括
类采样器{
私人:
标准:mt19937第二代;
公众:
采样器();
双样本();
};
Sampler::Sampler():gen_(std::random_设备{}()){}
福班{
私人:
采样器;
公众:
Foo(采样器);
};
Foo::Foo(采样器s):s_z(s){}//可以工作
试试看。您需要在Foo
中生成的另一个随机数,该随机数在Sampler
实例中生成?如果不是-为什么不存储引用/指针(智能指针)?为什么random\u设备
甚至是成员?你只需要在ctor执行时使用它,那么你为什么要让它保持活动状态呢?你是对的,所以你的意思是我也可以写:std::mt19937 gen_u(std::random_device())
?这里有一个分号不起作用
@Jonas谢谢,我更正了。
#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