【问题标题】:pointer to other class (boost::variate_generator) not work指向其他类的指针(boost::variate_generator)不起作用
【发布时间】:2015-10-07 21:17:16
【问题描述】:

我正在尝试使用 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 只在构造函数内部起作用。任何人都可以给我任何建议吗?谢谢!

【问题讨论】:

  • 为什么要涉及指针?
  • 嗨@Hurkyl,我试图使用 boost::variate_generator 对象作为私有成员,但我无法在 A 的构造函数体内实例化该对象,所以我稍后放弃
  • 啊,XY 问题;你应该问另一个关于你原来的问题的问题:当你需要做一些复杂的事情来设置它时,如何初始化一个对象。这有一个值得知道的答案!
  • 嗨@Hurkyl,是的,我想知道该怎么做。我采纳了 Tomasz 的建议,让两个对象的寿命更长,现在它起作用了,这是一个很好的解决方案,但考虑到我最初想做的事情,这似乎不是一个聪明的方法......

标签: c++ boost random


【解决方案1】:

randNorm 是一个局部变量(在析构函数结束时销毁),你在销毁后使用它。 如果你想要一个指针,写:

randPtr = new boost::variate_generator<boost::mt19937&, boost::normal_distribution<> >(rng, norm);

但是,从&amp; 的类型中,您可以猜到您的分布使用对伪随机数生成器的引用,因此您也必须使其寿命更长。

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

【讨论】:

  • 我明白了,指针指向的是本地的...谢谢!
猜你喜欢
  • 2012-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-08
相关资源
最近更新 更多