2017-02-02 28 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