2015-10-18 35 views
1

我一直在遵循documentation from the boost library生成多精度隨機整數,但在文檔中沒有提到如何設置種子。Boost Multiprecision隨機發生器種子錯誤

我想不出如何設置種子沒有得到編譯錯誤。

#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; 
} 

我如何編譯:

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

這是編譯錯誤,我得到:

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’ 

我也試圖與C++ 11,但我仍然編譯有錯誤。你能告訴我它是如何完成的嗎?

與C++ 11

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

結果編譯:

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); 
+0

確保您的標誌'-std = C++ 11'添加到編輯命令。 – vsoftco

+0

@vsoftco我加入了對C++的11 –

回答

1

你混合使用命名空間的所有種類的操作系統。這將是混亂的編譯器(它是我的):

另外,還有一些與需要特定順序的包括多倍隨機一些提振版本問題:

這裏有一個編譯例子:

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; 
    } 
} 

打印

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

+0

工作就像一個魅力信息 –