Я знаю, что хорошей практикой является вызов srand () только один раз (в противном случае вы можете получить аналогичные последовательности при вызове с тем же начальным числом).
Теперь я реализую класс, который будет использоваться в других кодах (возможно, не в моем), поэтому у меня нет доступа к main ().
Я хотел бы знать, есть ли соглашение об использовании rand в классах?
Как некоторый макрос функции, который проверяет, был ли srand уже вызван (и если нет, вызовите его в конструкторе или что-то в этом роде).
Или я просто доверяю людям, которые собираются использовать его для вызова srand () в начале main ()?
Спасибо,
РЕДАКТИРОВАТЬ @Malloc:
Спасибо, поэтому, если я правильно понимаю, мне придется использовать этот тип инициализации:
std::random_device r_device;
std::default_random_engine r_engine (r_device());
std::uniform_real_distribution<double> uniform_noise (a,b);
И тогда я могу вызвать реализацию с:
uniform_noise(r_engine);
И посев не сделан с текущим временем?
Поэтому я могу, например, выполнить инициализацию в конструкторе и поместить движок и дистрибутив как частные члены?
В современном C ++ использование rand()
а также srand()
не рекомендуется
Вы должны использовать C ++ 11 <random>
библиотека вместо.
Вот Вы можете получить хороший обзор, почему <random>
лучше, чем rand()
,
По поводу вашей проблемы:
Вы можете просто запустить любой случайный движок, который вы хотите использовать (например, std::default_radom_engine
) с std::random_device
Где бы вы ни хотели и должны быть сохранены, или просто используйте разные движки (могут быть одного типа) в разных частях вашего кода и запустите каждый из них один раз.
Это, вероятно, подпадает под категорию «документ это». Понятно, звонит srand()
в какой-то момент ваша библиотека может помешать другому коду работать должным образом. Так что если ваш код полагается на srand
После того как вы позвонили, вам нужно объяснить в своей документации, что вы хотите, чтобы код вызывающего абонента вызывал srand
перед использованием ваших функций.
Насколько я знаю, нет возможности проверить, srand
действительно был назван.
Могут быть и другие решения, если у вас есть ограничения в вашей среде. Например, в Glibc rand
а также srand
Вы могли бы использовать rand_r
который принимает указатель на seed
переменная — так что вы можете иметь свою совершенно отдельную последовательность случайных чисел, которая не зависит от внешней «помощи».