Nano Hash - криптовалюты, майнинг, программирование

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

Я пытаюсь использовать библиотеки Boost multiprecision для 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);

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


Ответы:


1

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

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

Live On 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);

}}}
18.04.2015
  • В версии Boost 1.60 не рекомендуется использовать заголовок boost / multiprecision / random.hpp. 22.02.2016

  • 2

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

    gen.seed(a_value_used_as_seed)
    

    См. это.

    ИЗМЕНИТЬ

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

    void generate(type*,type*)
    

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

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

    17.04.2015
  • Спасибо, @Vincent. Я изо всех сил пытаюсь применить этот синтаксис к версии boost :: random, но безуспешно. Код хорошо работает с std independent_bits_engine, но, конечно, не может генерировать числа, превышающие 64 бита. Любой вариант аналогичного синтаксиса, который я пытаюсь использовать с Boost :: Random, дает ошибку времени компиляции: error: нет элемента с именем 'generate' в 'boost :: multiprecision :: number ‹boost :: multiprecision :: backends :: gmp_int, 1› ' 17.04.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..