Search code examples
c++boostrandomrandom-seedmultiprecision

Boost Multiprecision random generator seed error


I have been following the documentation from the boost library to generate multiprecision random integers but In the documentation it is not mentioned how to set the seed.

I can't figure how to set the seed without getting compilation errors.

#include <boost/multiprecision/gmp.hpp>     
#include <boost/multiprecision/random.hpp>  
#include <fstream>  

using namespace boost::multiprecision;
using namespace boost::random;
using namespace std;

//...    

typedef independent_bits_engine<mt19937, N_BITS, mpz_int> generator_type;

int main() 
{
    // ...

    generator_type gen;
    seed_seq sed_seq = { 12064, 3867, 13555, 28676, 4599, 5031, 13040 };
    gen.seed(sed_seq); 

    // ...

    for(unsigned i = 0; i < SS; ++i)  {
     out
        << gen()
        << endl;
    }

    out.close();
    return 0;
}

How do I compile:

$ g++ generateinputs.cpp -o generateinputs.o -L/gmp_install/lib -lgmp

And this are the compilation errors that I get:

generateinputs.cpp: In function ‘int main()’:
generateinputs.cpp:35:68: error: in C++98 ‘sed_seq’ must be initialized by constructor, not by ‘{...}’
  seed_seq sed_seq = { 12064, 3867, 13555, 28676, 4599, 5031, 13040 };
                                                                    ^
generateinputs.cpp:35:68: error: could not convert ‘{12064, 3867, 13555, 28676, 4599, 5031, 13040}’ from ‘<brace-enclosed initializer list>’ to ‘boost::random::seed_seq’

I have also tried to compile with c++11 but I still have errors. Can you show me how It's done?

Compiling with C++11

$ g++ -std=c++11 generateinputs.cpp -o generateinputs.o -L/gmp_install/lib -lgmp 

Results in:

generateinputs.cpp:26:9: error: reference to ‘independent_bits_engine’ is ambiguous
 typedef independent_bits_engine<mt19937, N_BITS, mpz_int> generator_type;

In file included from /usr/include/c++/4.8/random:50:0,
             from /usr/include/c++/4.8/bits/stl_algo.h:65,
             from /usr/include/c++/4.8/algorithm:62,
             from /usr/include/boost/math/tools/config.hpp:16,
             from /usr/include/boost/math/policies/error_handling.hpp:18,
             from /usr/include/boost/multiprecision/detail/default_ops.hpp:9,
             from /usr/include/boost/multiprecision/detail/generic_interconvert.hpp:9,
             from /usr/include/boost/multiprecision/number.hpp:22,
             from /usr/include/boost/multiprecision/gmp.hpp:9,
             from generateinputs.cpp:8:
/usr/include/c++/4.8/bits/random.h:1074:11: note: candidates are: template<class _RandomNumberEngine, long unsigned int __w, class _UIntType> class std::independent_bits_engine
 class independent_bits_engine

In file included from /usr/include/boost/random.hpp:38:0,
             from /usr/include/boost/multiprecision/random.hpp:31,
             from generateinputs.cpp:9:
/usr/include/boost/random/independent_bits.hpp:44:7: note:                 template<class Engine, long unsigned int w, class UIntType> class boost::random::independent_bits_engine
 class independent_bits_engine

generateinputs.cpp:26:9: error: ‘independent_bits_engine’ does not name a type
 typedef independent_bits_engine<mt19937, N_BITS, mpz_int> generator_type;

generateinputs.cpp: In function ‘int main()’:
generateinputs.cpp:33:6: error: ‘generator_type’ was not declared in this scope
  generator_type gen;

generateinputs.cpp:33:21: error: expected ‘;’ before ‘gen’
  generator_type gen;

generateinputs.cpp:36:2: error: reference to ‘seed_seq’ is ambiguous
seed_seq sed_seq = { 12064, 3867, 13555, 28676, 4599, 5031, 13040 };

In file included from /usr/include/c++/4.8/random:50:0,
             from /usr/include/c++/4.8/bits/stl_algo.h:65,
             from /usr/include/c++/4.8/algorithm:62,
             from /usr/include/boost/math/tools/config.hpp:16,
             from /usr/include/boost/math/policies/error_handling.hpp:18,
             from /usr/include/boost/multiprecision/detail/default_ops.hpp:9,
             from /usr/include/boost/multiprecision/detail/generic_interconvert.hpp:9,
             from /usr/include/boost/multiprecision/number.hpp:22,
             from /usr/include/boost/multiprecision/gmp.hpp:9,
             from generateinputs.cpp:8:
/usr/include/c++/4.8/bits/random.h:6025:9: note: candidates are: class     std::seed_seq
   class seed_seq

In file included from /usr/include/boost/random.hpp:53:0,
             from /usr/include/boost/multiprecision/random.hpp:31,
             from generateinputs.cpp:9:
/usr/include/boost/random/seed_seq.hpp:39:7: note:                 class boost::random::seed_seq
 class seed_seq {

generateinputs.cpp:36:11: error: expected ‘;’ before ‘sed_seq’
  seed_seq sed_seq = { 12064, 3867, 13555, 28676, 4599, 5031, 13040 };

generateinputs.cpp:37:2: error: ‘gen’ was not declared in this scope
  gen.seed(sed_seq); 

generateinputs.cpp:37:11: error: ‘sed_seq’ was not declared in this scope
  gen.seed(sed_seq); 

Solution

  • You are mixing all kind os using namespaces. That's going to be confusing to the compiler (it was for mine):

    Also, there are issues with some boost versions that require a specific order of includes for Multiprecision Random:

    Here's a compiling example:

    Live On Coliru

    #include <boost/multiprecision/random.hpp>  
    #include <boost/multiprecision/gmp.hpp>     
    #include <fstream>  
    
    using namespace boost::multiprecision;
    
    //...    
    
    typedef boost::random::independent_bits_engine<boost::mt19937, 64, mpz_int> generator_type;
    
    int main() 
    {
        // ...
    
        generator_type gen;
        boost::random::seed_seq sed_seq = { 12064, 3867, 13555, 28676, 4599, 5031, 13040 };
        gen.seed(sed_seq); 
    
        // ...
    
        for(unsigned i = 0; i < 100; ++i)  {
            std::cout
                << gen()
                << std::endl;
        }
    }
    

    Prints

    11603821463643999656
    4488770058702608721
    1099573171307694078
    7494639050429105831
    5349003296707484949
    13868768316190520445
    3211410294221291057
    1325784923029427329
    7032238616474679265
    ...
    

    etc.