Использование Boost.Random для генерации целочисленных чисел из начального числа

Я пытаюсь использовать мультипрецизионные библиотеки 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 Mersenne:

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

но я не уверен, как посеять мультиточность. Я получаю сообщение об ошибке, если пытаюсь присоединить какие-либо аргументы к объявлению generator_type.

1

Решение

Просто не забудьте включить правильные заголовки в правильном порядке. Удостовериться boost/multiprecision/random.hpp Включено до например boost/random.hpp, [1]

Вот рабочий образец:

Жить на Колиру

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

}}}
2

Другие решения

Вы можете посеять independent_bits_engine следующим образом:

gen.seed(a_value_used_as_seed)

Увидеть этот.

РЕДАКТИРОВАТЬ

mt19937 производит uint32_t целые числа и использует тот же тип, что и семя. Однако он также принимает начальную последовательность, которую можно использовать для создания начальных чисел, которые распределены по всему 32-битному диапазону. Начальная последовательность может быть любым классом, если она определяет некоторые функции. Одним из них является следующее:

void generate(type*,type*)

Эти два разных способа заполнения представлены двумя шаблонными функциями.

Тип, который используется в independent_bits_engine это mpz_int целое число. Когда двигатель посеян, он пропускает семена в базовый двигатель, мерсеновый твистер. Для mt19937 mpz_int, не является его базовым типом, поэтому компилятор выбирает вторую функцию шаблона и интерпретирует начальное число как начальную последовательность. Это вызывает ошибку, потому что mpz_int класс, не имеет generatorфункция.

-1

По вопросам рекламы [email protected]