使用Boost.Random从种子生成多精度整数

时间:2015-04-17 17:34:11

标签: c++ boost random mersenne-twister multiprecision

我试图使用C ++的Boost multiprecision库来生成大的随机数。我无法创建一个按时间或其他随机数播种的生成器,因此我的生成器在每次运行时生成相同的数字。如何使用更改值为生成器设定种子,以便在每次运行时生成不同的值?下面是可以工作但在每次运行时生成相同值的代码:

 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 mersenne twister:

std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(1, 410);
std::cout << dis(gen);

但我不确定如何播种多精度mt。如果我尝试将任何参数附加到generator_type声明,我会收到错误。

2 个答案:

答案 0 :(得分:2)

请务必按正确的顺序添加正确的标题。确保{/ 1}}包含在之前,例如 boost/multiprecision/random.hpp [1]

这是一个工作样本:

<强> Live On Coliru

boost/random.hpp

打印:

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

[1] 有关理由,请参阅标题:

-1933652715378833784248363501979652496795524829874743132697181322648247480952527478485970668716806865063045317090084841622
-1468881213423638668843172777487968633185322950671475476288214928834762957270366851213470028408822700452414112732095789399
-438410269130756764874038685663894375462191729266787898021001121529040612201593866121171654735148672212107859934777249455
1640218057904403949431629353470797958943403389857715009204662011172706206212175540336638682612917363014646204359229208161
2080556950904231221688486212902649050443577133350992840521950777901511719409216800649680002332270542856870490906586634021
-2462847552934789794366130512379986584363897268428607239076390917679673552257507232435012961043902569359791960286013555735
1862125165202309929540318106374963238582997665808535945941185531430178511983671609033768595314282085775703389782906055681
-2252919975572088150601736662143078753669379374770846936106371833826830834376177961242332270710557376868189820866644291936
986998873018694187216384502983789929097242088320473495018118860428802373488463609060400540575932015408503979156759366945
111638721010166959954664901006097000984357549061159193446548907668369849648549091048841517202745565156043524728780018634

答案 1 :(得分:-1)

您可以通过以下方式播种independent_bits_engine

gen.seed(a_value_used_as_seed)

请参阅this

修改

mt19937生成uint32_t个整数,并使用与种子相同的类型。但是,它还接受种子序列,可用于创建在整个32位范围内分布的种子。种子序列可以是任何类,只要它定义了一些函数即可。其中之一如下:

void generate(type*,type*)

这两种不同的播种方式由两个模板函数表示。

independent_bits_engine中使用的类型是mpz_int整数。当发动机播种时,它将种子传递给基础发动机,即mersenne twister。对于mt19937 mpz_int,它不是它的基类型,因此编译器选择第二个模板函数并将种子解释为种子序列。这会导致错误,因为mpz_int类没有generator函数。