我尝试使用boost的多精度从正态分布生成随机数。我可以从均匀分布中生成随机数,但是当我尝试从标准法线生成时,它会报告错误。 这是代码:
(从Examples from boost开始,将mpz_int更改为cpp_int,将mpf_float_50更改为cpp_dec_float_50)
#include <boost/multiprecision/cpp_int.hpp>
#include <boost/multiprecision/cpp_dec_float.hpp>
#include <boost/multiprecision/random.hpp>
#include <boost/multiprecision/number.hpp>
int main()
{
using namespace boost::multiprecision;
using namespace boost::random;
uniform_01<cpp_dec_float_50> uf;
normal_distribution<cpp_dec_float_50> n01(0.0, 1.0);
independent_bits_engine<mt19937, 50L*1000L/301L, cpp_int> gen;
std::cout << std::setprecision(50);
for(unsigned i = 0; i < 1; ++i) {
std::cout << uf(gen) << std::endl;
std::cout << n01(gen) << std::endl;
}
return 0;
}
但是,我可以从均匀分布中生成随机数,但是当我尝试从标准法线生成时,它会显示:
g ++ -I /〜/ boost / boost_1_58_0 -O0 -g3 -Wall -c -fmessage-length = 0 -MMD -MP -MF&#34; test_boost.d&#34; -MT&#34; test_boost.d&#34; -o&#34; test_boost.o&#34; &#34; ../ test_boost.cpp&#34;
boost / boost_1_58_0 / boost / random / detail / uniform_int_float.hpp:63:错误:类型无效的static_cast 'boost :: multiprecision :: detail :: expression&gt;,(boost :: multiprecision :: expression_template_option)1u&gt ;, boost :: multiprecision :: number&gt;,(boost :: multiprecision :: expression_template_option)1u&gt;,void, void&gt;'输入'long unsigned int'
我使用gcc版本4.4.7和64位linux系统。非常感谢你。
(我也尝试使用boost的例子来生成随机数,但我只是通过包含很多错误,例如: 错误:'struct boost :: multiprecision :: backends :: gmp_int'没有名为'data'的成员)
我稍微更改了代码:
#include <boost/multiprecision/random.hpp>
#include <boost/random.hpp>
#include <boost/multiprecision/cpp_int.hpp>
#include <boost/multiprecision/cpp_dec_float.hpp>
int main() {
namespace mp = boost::multiprecision;
boost::uniform_01<mp::cpp_dec_float_50> uf;
boost::normal_distribution<mp::cpp_dec_float_50> n01(0.0, 1.0);
boost::random::independent_bits_engine<boost::mt19937, 50L * 1000L / 301L, mp::number<mp::cpp_int::backend_type, mp::et_off> > gen;
std::cout << std::setprecision(50);
for (unsigned i = 0; i < 10; ++i) {
std::cout << uf(gen) << std::endl;
std::cout << n01(gen) << std::endl;
}
return 0;
}
以下是完整的错误消息:
****增量构建配置调试项目test_boost **** 做所有 构建文件:../ test_boost.cpp 调用:交叉G ++编译器 g ++ -I /〜/ boost / boost_1_58_0 -O0 -g3 -Wall -c -fmessage-length = 0 -MMD -MP -MF&#34; test_boost.d&#34; -MT&#34; test_boost.d&#34; -o&#34; test_boost.o&#34; &#34; ../ test_boost.cpp&#34;
来自
的文件~/boost/boost_1_58_0/boost/random/uniform_int_distribution.hpp:29,
这
~/boost/boost_1_58_0/boost/random/random_number_generator.hpp:20,
来自
~/boost/boost_1_58_0/boost/random.hpp:54,
这
~/boost/boost_1_58_0/boost/multiprecision/random.hpp:31,
这
../test_boost.cpp:114:
〜/ boost / boost_1_58_0 / boost / random / detail / uniform_int_float.hpp:在成员函数中
‘typename boost::uint_t<((std::numeric_limits::digits < std::numeric_limits::digits) ? std::numeric_limits::digits : std::numeric_limits::digits)>::fast boost::random::detail::uniform_int_float<URNG>::operator()() [with URNG = boost::random::independent_bits_engine<boost::random::mersenne_twister_engine<unsigned int, 32ul, 624ul, 397ul, 31ul, 2567483615u, 11ul, 4294967295u, 7ul, 2636928640u, 15ul, 4022730752u, 18ul, 1812433253u>, 166ul, boost::multiprecision::number<boost::multiprecision::backends::cpp_int_backend<0u, 0u, (boost::multiprecision::cpp_integer_type)1u, (boost::multiprecision::cpp_int_check_type)0u, std::allocator<unsigned int> >, (boost::multiprecision::expression_template_option)0u> >]’:
~/boost/boost_1_58_0/boost/random/uniform_int_distribution.hpp:67: instantiated from ‘T boost::random::detail::generate_uniform_int(Engine&, T, T, mpl_::true_) [with Engine = boost::random::detail::uniform_int_float<boost::random::independent_bits_engine<boost::random::mersenne_twister_engine<unsigned int, 32ul, 624ul, 397ul, 31ul, 2567483615u, 11ul, 4294967295u, 7ul, 2636928640u, 15ul, 4022730752u, 18ul, 1812433253u>, 166ul, boost::multiprecision::number<boost::multiprecision::backends::cpp_int_backend<0u, 0u, (boost::multiprecision::cpp_integer_type)1u, (boost::multiprecision::cpp_int_check_type)0u, std::allocator<unsigned int> >, (boost::multiprecision::expression_template_option)0u> > >, T = int]’
~/boost/boost_1_58_0/boost/random/uniform_int_distribution.hpp:222: instantiated from ‘T boost::random::detail::generate_uniform_int(Engine&, T, T, mpl_::false_) [with Engine = boost::random::independent_bits_engine<boost::random::mersenne_twister_engine<unsigned int, 32ul, 624ul, 397ul, 31ul, 2567483615u, 11ul, 4294967295u, 7ul, 2636928640u, 15ul, 4022730752u, 18ul, 1812433253u>, 166ul, boost::multiprecision::number<boost::multiprecision::backends::cpp_int_backend<0u, 0u, (boost::multiprecision::cpp_integer_type)1u, (boost::multiprecision::cpp_int_check_type)0u, std::allocator<unsigned int> >, (boost::multiprecision::expression_template_option)0u> >, T = int]’
~/boost/boost_1_58_0/boost/random/uniform_int_distribution.hpp:230: instantiated from ‘T boost::random::detail::generate_uniform_int(Engine&, T, T) [with Engine = boost::random::independent_bits_engine<boost::random::mersenne_twister_engine<unsigned int, 32ul, 624ul, 397ul, 31ul, 2567483615u, 11ul, 4294967295u, 7ul, 2636928640u, 15ul, 4022730752u, 18ul, 1812433253u>, 166ul, boost::multiprecision::number<boost::multiprecision::backends::cpp_int_backend<0u, 0u, (boost::multiprecision::cpp_integer_type)1u, (boost::multiprecision::cpp_int_check_type)0u, std::allocator<unsigned int> >, (boost::multiprecision::expression_template_option)0u> >, T = int]’
~/boost/boost_1_58_0/boost/random/uniform_int_distribution.hpp:353: instantiated from ‘IntType boost::random::uniform_int_distribution<IntType>::operator()(Engine&) const [with Engine = boost::random::independent_bits_engine<boost::random::mersenne_twister_engine<unsigned int, 32ul, 624ul, 397ul, 31ul, 2567483615u, 11ul, 4294967295u, 7ul, 2636928640u, 15ul, 4022730752u, 18ul, 1812433253u>, 166ul, boost::multiprecision::number<boost::multiprecision::backends::cpp_int_backend<0u, 0u, (boost::multiprecision::cpp_integer_type)1u, (boost::multiprecision::cpp_int_check_type)0u, std::allocator<unsigned int> >, (boost::multiprecision::expression_template_option)0u> >, IntType = int]’
~/boost/boost_1_58_0/boost/random/normal_distribution.hpp:195: instantiated from ‘std::pair<RealType, int> boost::random::detail::generate_int_float_pair(Engine&, mpl_::false_) [with RealType = boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1u>, long unsigned int w = 8ul, Engine = boost::random::independent_bits_engine<boost::random::mersenne_twister_engine<unsigned int, 32ul, 624ul, 397ul, 31ul, 2567483615u, 11ul, 4294967295u, 7ul, 2636928640u, 15ul, 4022730752u, 18ul, 1812433253u>, 166ul, boost::multiprecision::number<boost::multiprecision::backends::cpp_int_backend<0u, 0u, (boost::multiprecision::cpp_integer_type)1u, (boost::multiprecision::cpp_int_check_type)0u, std::allocator<unsigned int> >, (boost::multiprecision::expression_template_option)0u> >]’
~/boost/boost_1_58_0/boost/random/normal_distribution.hpp:205: instantiated from ‘std::pair<RealType, int> boost::random::detail::generate_int_float_pair(Engine&) [with RealType = boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1u>, long unsigned int w = 8ul, Engine = boost::random::independent_bits_engine<boost::random::mersenne_twister_engine<unsigned int, 32ul, 624ul, 397ul, 31ul, 2567483615u, 11ul, 4294967295u, 7ul, 2636928640u, 15ul, 4022730752u, 18ul, 1812433253u>, 166ul, boost::multiprecision::number<boost::multiprecision::backends::cpp_int_backend<0u, 0u, (boost::multiprecision::cpp_integer_type)1u, (boost::multiprecision::cpp_int_check_type)0u, std::allocator<unsigned int> >, (boost::multiprecision::expression_template_option)0u> >]’
~/boost/boost_1_58_0/boost/random/normal_distribution.hpp:216: instantiated from ‘RealType `boost::random::detail::unit_normal_distribution<RealType>::operator()(Engine&) [with Engine = boost::random::independent_bits_engine<boost::random::mersenne_twister_engine<unsigned int, 32ul, 624ul, 397ul, 31ul, 2567483615u, 11ul, 4294967295u, 7ul, 2636928640u, 15ul, 4022730752u, 18ul, 1812433253u>, 166ul, boost::multiprecision::number<boost::multiprecision::backends::cpp_int_backend<0u, 0u, (boost::multiprecision::cpp_integer_type)1u, (boost::multiprecision::cpp_int_check_type)0u, std::allocator<unsigned int> >, (boost::multiprecision::expression_template_option)0u> >, RealType = boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1u>]’`
~/boost/boost_1_58_0/boost/random/normal_distribution.hpp:357: instantiated from ‘RealType `boost::random::normal_distribution<RealType>::operator()(Engine&) [with Engine = boost::random::independent_bits_engine<boost::random::mersenne_twister_engine<unsigned int, 32ul, 624ul, 397ul, 31ul, 2567483615u, 11ul, 4294967295u, 7ul, 2636928640u, 15ul, 4022730752u, 18ul, 1812433253u>, 166ul, boost::multiprecision::number<boost::multiprecision::backends::cpp_int_backend<0u, 0u, (boost::multiprecision::cpp_integer_type)1u, (boost::multiprecision::cpp_int_check_type)0u, std::allocator<unsigned int> >, (boost::multiprecision::expression_template_option)0u> >, RealType = boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1u>]’`
../ test_boost.cpp:135:从这里实例化
〜/ boost / boost_1_58_0 / boost / random / detail / uniform_int_float.hpp:63:错误:类型无效的static_cast ‘boost::multiprecision::number<boost::multiprecision::backends::cpp_int_backend<0u, 0u, (boost::multiprecision::cpp_integer_type)1u, (boost::multiprecision::cpp_int_check_type)0u, std::allocator<unsigned int> >, (boost::multiprecision::expression_template_option)0u>’ to type ‘long unsigned int’
make:*** [test_boost.o]错误1
17:21:45构建完成(耗时910毫秒)
答案 0 :(得分:0)
一些棘手的问题:
belongs_to
参数的表达式模板禁用为cpp_int
。<强> Live On Coliru 强>
independent_bits
打印例如。
#include <boost/multiprecision/random.hpp>
#include <boost/random.hpp>
#include <boost/multiprecision/cpp_int.hpp>
#include <boost/multiprecision/cpp_dec_float.hpp>
#include <boost/multiprecision/number.hpp>
int main() {
namespace mp = boost::multiprecision;
boost::uniform_01<mp::cpp_dec_float_50> uf;
boost::normal_distribution<mp::cpp_dec_float_50> n01(0.0, 1.0);
boost::random::independent_bits_engine<boost::mt19937, 50L * 1000L / 301L, mp::number<mp::cpp_int::backend_type, mp::et_off> > gen;
std::cout << std::setprecision(50);
for (unsigned i = 0; i < 10; ++i) {
std::cout << uf(gen) << std::endl;
std::cout << n01(gen) << std::endl;
}
return 0;
}