У меня есть класс, который содержит два источника случайности.
std::random_device rd;
std::mt19937 random_engine;
Я задаю std::mt19937
вызовом std::random_device
. Если я хочу сгенерировать число и меня не волнует повторяемость, следует ли мне звонить rd()
или random_engine()
?
В моем конкретном случае я уверен, что оба будут работать нормально, потому что это будет вызываться в каком-то сетевом коде, где производительность не в приоритете, а результаты не особенно чувствительны. Однако меня интересуют некоторые «эмпирические правила» о том, когда использовать аппаратную энтропию, а когда использовать псевдо-случайные числа.
В настоящее время я использую только std::random_device
для заполнения моего движка std::mt19937
, и для любой генерации случайных чисел, которая мне нужна для моей программы, я использую движок std::mt19937
.
редактировать :Вот объяснение того, для чего именно я использую этот конкретный пример:
Это для игровой программы. Эта конкретная игра позволяет пользователю настроить свою «команду» до начала раунда против противника. Часть настройки битвы включает в себя отправку команды на сервер.Моя программа имеет несколько команд и использует случайное число, чтобы определить, какую команду загрузить. Каждый новый бой вызывает std::random_device
для заполнения генератора псевдо-случайных чисел. Я регистрирую начальное состояние битвы, включая эту команду, которую я выбираю случайным образом, и начальное семя.
Конкретное случайное число, о котором я спрашиваю в этом вопросе, предназначено для случайного выбора команды (, когда выгодно, чтобы противник не знал заранее, какую команду я использую, но не миссия -критическая ), но на самом деле я ищу эмпирическое правило. Можно ли всегда использовать std::random_device
, если мне не нужна повторяемость моих чисел, или есть реальный риск израсходовать энтропию быстрее, чем она может быть собрана?