我正在尝试使用 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只能在构造函数内部工作。有人能给我任何建议吗?谢谢!
答案 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)会更好。您也可以将这些对象用作字段,因为您不会以多态方式使用它们。