Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 以C+格式正确复制RNG+;_C++_Random_Copy Constructor_Mersenne Twister - Fatal编程技术网

C++ 以C+格式正确复制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()),但我无法复制该类

我有一个包含RNG的类:

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