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