我试图使用Boost多倍库C ++生成大量随机数。 我一直无法创建一个由时间或另一个随机种子数生成器,所以我的发生器产生在每次运行相同的数字。 如何籽变化的值发电机每个运行产生不同的价值观? 这里是一个工作,但产生每次运行的值相同的代码:
using namespace boost::multiprecision;
using namespace boost::random;
typedef independent_bits_engine<mt19937, 512, mpz_int> generator_type;
generator_type gen;
std::cout << gen() << "\n\n";
我已经接种成功之前性病梅森难题:
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(1, 410);
std::cout << dis(gen);
但我不知道如何播种多倍吨。 我得到一个错误,如果我尝试任何参数附加到generator_type声明。
只是一定要包括以正确的顺序正确的头。 确保boost/multiprecision/random.hpp
是如之前包括boost/random.hpp
。 [1]
这里的工作示例:
住在Coliru
#include <boost/multiprecision/gmp.hpp>
#include <boost/multiprecision/random.hpp>
#include <iostream>
int main()
{
namespace mp = boost::multiprecision;
using Int = mp::mpz_int;
boost::mt19937 rng(3); // fixing seed for demo
boost::uniform_int<Int> gen(-pow(Int(2), 400), pow(Int(2), 400));
for (int i=0; i<10; ++i)
std::cout << gen(rng) << "\n";
}
打印:
-1933652715378833784248363501979652496795524829874743132697181322648247480952527478485970668716806865063045317090084841622
-1468881213423638668843172777487968633185322950671475476288214928834762957270366851213470028408822700452414112732095789399
-438410269130756764874038685663894375462191729266787898021001121529040612201593866121171654735148672212107859934777249455
1640218057904403949431629353470797958943403389857715009204662011172706206212175540336638682612917363014646204359229208161
2080556950904231221688486212902649050443577133350992840521950777901511719409216800649680002332270542856870490906586634021
-2462847552934789794366130512379986584363897268428607239076390917679673552257507232435012961043902569359791960286013555735
1862125165202309929540318106374963238582997665808535945941185531430178511983671609033768595314282085775703389782906055681
-2252919975572088150601736662143078753669379374770846936106371833826830834376177961242332270710557376868189820866644291936
986998873018694187216384502983789929097242088320473495018118860428802373488463609060400540575932015408503979156759366945
111638721010166959954664901006097000984357549061159193446548907668369849648549091048841517202745565156043524728780018634
[1]基本原理请参阅头:
namespace boost{ namespace random{ namespace detail{
//
// This is a horrible hack: this declaration has to appear before the definition of
// uniform_int_distribution, otherwise it won't be used...
// Need to find a better solution, like make Boost.Random safe to use with
// UDT's and depricate/remove this header altogether.
//
template<class Engine, class Backend, boost::multiprecision::expression_template_option ExpressionTemplates>
boost::multiprecision::number<Backend, ExpressionTemplates>
generate_uniform_int(Engine& eng, const boost::multiprecision::number<Backend, ExpressionTemplates>& min_value, const boost::multiprecision::number<Backend, ExpressionTemplates>& max_value);
}}}
您可以播种的independent_bits_engine
以下列方式:
gen.seed(a_value_used_as_seed)
请参见本 。
编辑
所述mt19937
产生uint32_t
整数,使用相同类型的种子。 然而,它也接受一个种子序列,至极可用于创建在尤为明显在整个32位范围分布式种子。 种子序列可以是任何类,只要它定义了一些功能。 其中之一是以下几点:
void generate(type*,type*)
播种的这两种不同的方式由两个模板函数来表示。
即在使用的类型independent_bits_engine
是mpz_int
整数。 当发动机是播种时,它把种子到基座发动机,Mersenne扭曲。 对于mt19937
的mpz_int
,不是它的基类型,所以编译器选择所述第二模板函数和解释种子作为种子序列。 这会导致由于一个错误mpz_int
类,不具有generator
的功能。