
Hey there, I'm having a problem with the boost::random library and I can't figure out what's going on, so maybe you guys might help me out. Here's the scenario (code below): I wrote a small class that should encapsulate a random number generator (floating point, uniform in [0,1) ) so that I ultimately can switch between different approaches (boost and non-boost) without the rest of my code ever caring. Within this class I have a boost::mt19937 object and a pointer to a boost::uniform_01<boost::mt19937&, double> as private members. Within the constructor I actually create an instance of uniform_01 via new and initialize it with the mt19937 RNG. Now within the constructor (see cout statement) the ran_boost->operator()() or (*ran_boost)() work perfectly and yield some random double between 0 and 1. However, when using the randomNumberGenerator object created in main.cpp I'm struck with segfault. Doing some backtrace it turns out that it fails with in boost::random::mersenne_twister<unsigned int, 32, 624, 397, 31, 2567483615u, 11, 7, 2636928640u, 15, 4022730752u, 18, 3346425566u>::operator() ( this=0x89485ed18949ed31) at /home/fochler/usr/include/boost/random/mersenne_twister.hpp:275 If I try to use global object ran2 (declared extern in random2.h and defined in random2.cpp) I also get a segfault, this time with in boost::random::detail::pass_through_engine<boost::random::mersenne_twister<unsigned int, 32, 624, 397, 31, 2567483615u, 11, 7, 2636928640u, 15, 4022730752u, 18, 3346425566u>&>::base (this=0x0) at /home/fochler/usr/include/boost/random/detail/pass_through_engine.hpp:42 42 base_type& base() { return helper_type::ref(_rng); } I don't really know (a) what is going on and what I've messed up and (b) whether these two errors (using the local and the global object) are connected. It would be great if somebody could help me out. Cheers, Oliver Some minimal example ----------------- random2.h ----------------- #ifndef RANDOM_NG_H #define RANDOM_NG_H #include <stdint.h> #include <boost/random.hpp> class randomNumberGenerator { public: randomNumberGenerator( const uint32_t s ); double operator()() { return ran_boost->operator()(); } private: boost::mt19937 rng_mt_boost; boost::uniform_01<boost::mt19937&, double> * ran_boost; }; extern randomNumberGenerator ran2; #endif ----------------- random2.cpp ----------------- #include <iostream> #include <boost/random.hpp> #include "random2.h" randomNumberGenerator ran2; randomNumberGenerator::randomNumberGenerator( const uint32_t s ) { boost::uniform_01<boost::mt19937&, double> * ran_boost = new boost::uniform_01<boost::mt19937&, double>( rng_mt_boost ); rng_mt_boost.seed( s ); std::cout << ran_boost->operator()() << std::endl; } ----------------- main.cpp ----------------- #include "random2.h" int main(int argc, char **argv) { randomNumberGenerator ran3( 1234567 ); double a = ran2(); double b = ran3(); return 0; }