Можно ли установить детерминированное начальное число для boost :: random ::iform_int_distribution & lt; & gt ;?

я использую boost::random::uniform_int_distribution<boost::multiprecision::uint256_t> генерировать некоторые юнит-тесты. Обратите внимание, что я использую multiprecisionВот почему мне нужно использовать boost, а не стандартную библиотеку. Для моих периодических тестов мне нужно генерировать детерминированные результаты из недетерминированного семени, но таким образом, чтобы я мог воспроизвести результаты позже в случае неудачи тестов.

Итак, я бы сгенерировал истинное случайное число и использовал бы его как начальное число uniform_int_distribution, Цель состоит в том, что если это не удастся, я смогу воспроизвести проблему с тем же начальным числом, из-за которого тесты не пройдены.

Поддерживает ли эта часть надстройки генерирование случайных чисел на основе начальных значений в своем интерфейсе? Если нет, есть ли другой способ сделать это?

В настоящее время я генерирую случайные числа:

boost::random::random_device                                              gen;
boost::random::uniform_int_distribution<boost::multiprecision::uint256_t> dist{100, 1000};
auto random_num = dist(gen);

PS: Пожалуйста, имейте в виду, что основным требованием является поддержка multiprecision, Мне требуются числа в диапазоне от 16 до 512 бит. Это для тестов, поэтому производительность не является обязательным требованием. Я в порядке генерации больших случайных чисел другими способами и преобразования их в boost::multiprecision,

1

Решение

boost::random::random_device это Non-deterministic Uniform Random Number Generator, правда генератор случайных чисел. Если вам не нужны реальные недетерминированные случайные числа, вы можете использовать Pseudo-Random Number Generator (по крайней мере, в целях тестирования), который можно посеять. Одним из известных генераторов псевдослучайных чисел является мерсенновый твистер boost::random::mt19937,

Этот генератор обычно засевается реальный случайное число, которое вы можете напечатать для воспроизводимости в своих модульных тестах:

auto seed = boost::random::random_device{}();
std::cout << "Using seed: " << seed << '\n';
boost::random::mt19937 gen{ seed };
boost::random::uniform_int_distribution<boost::multiprecision::uint256_t> dist{100, 1000};
auto random_num = dist(gen);
2

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

Других решений пока нет …