2017-02-02 58 views
2

我有一个包含RNG类:在C++ 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 
{} 

虽然这使得总感觉我不知道一个怎么会为了使其工作实现这一点。我已经读过一个机会,就是构建一个合适的拷贝构造函数,这样每次拷贝时都会有一个新种子播种,但我不知道如何去做。

+0

您需要''Foo'中产生的另一个随机数,它在'Sampler'实例中?如果不是 - 为什么不存储引用/指针(智能指针)? – ForEveR

+2

为什么'random_device'甚至是成员?你在ctor执行时只需要它,那么为什么你要保持它活着? – MSalters

+0

你是对的,所以你的意思是我也可以写:'std :: mt19937 gen_(std :: random_device())'? – beginneR

回答

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