指向其他类(boost :: variate_generator)的指针不起作用

时间:2015-10-07 21:17:17

标签: c++ boost random

我正在尝试使用 boost / random.hpp 生成随机数,我想在初始化时修复种子,并调用 getRandom()来生成根据种子的随机数。但是这段代码不起作用:

class A 
{
public:
    A() 
    {
        unsigned long seed =12411;
        boost::mt19937 rng(seed);
        boost::normal_distribution<> norm(0.0, 1.0);  
        boost::variate_generator<boost::mt19937&,
                                 boost::normal_distribution<> > 
        randNorm(rng, norm);
        randPtr = &randNorm;
        //(*randPtr)();
        std::cout << (*randPtr)() << std::endl;
    }
    double getRandom() 
    {
        return (*randPtr)();
    }        
private:
    boost::variate_generator<boost::mt19937&,
                             boost::normal_distribution<> >* 
    randPtr;

};
int main() {
    A a;
    std::cout << a.getRandom() << std::endl;
}

对于上面的代码,它可以编译,将打印一个随机数(在构造函数中调用),然后 Segmentation fault:11 。所以指针randPtr只能在构造函数内部工作。有人能给我任何建议吗?谢谢!

1 个答案:

答案 0 :(得分:1)

/finalOutputDir/producerName/producerVersion/File.txt 是一个局部变量(在析构函数的末尾被销毁),你在破坏后使用它。 如果你想要一个指针,写:

randNorm

但是,从类型randPtr = new boost::variate_generator<boost::mt19937&, boost::normal_distribution<> >(rng, norm); 开始,您可以猜测您的发行版使用对伪随机数生成器的引用,因此您也必须延长它的使用寿命。

一般情况下 - 使用&(或unique_ptr,如果您更喜欢scoped_ptr或无法访问C ++ 11)会更好。您也可以将这些对象用作字段,因为您不会以多态方式使用它们。