Можно ли установить детерминированное начальное значение для boost :: random ::iform_int_distribution <>? - PullRequest
0 голосов
/ 31 августа 2018

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

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

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

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

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 Ответ

0 голосов
/ 31 августа 2018

boost::random::random_device - это Non-deterministic Uniform Random Number Generator, true генератор случайных чисел. Если вам не нужны реальные недетерминированные случайные числа, вы можете использовать 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...