соглашение относительно srand () и реализации класса

Я знаю, что хорошей практикой является вызов 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);

И посев не сделан с текущим временем?
Поэтому я могу, например, выполнить инициализацию в конструкторе и поместить движок и дистрибутив как частные члены?

1

Решение

В современном C ++ использование rand() а также srand() не рекомендуется

Вы должны использовать C ++ 11 <random> библиотека вместо.

Вот Вы можете получить хороший обзор, почему <random> лучше, чем rand(),

По поводу вашей проблемы:

Вы можете просто запустить любой случайный движок, который вы хотите использовать (например, std::default_radom_engine) с std::random_device Где бы вы ни хотели и должны быть сохранены, или просто используйте разные движки (могут быть одного типа) в разных частях вашего кода и запустите каждый из них один раз.

3

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

Это, вероятно, подпадает под категорию «документ это». Понятно, звонит srand() в какой-то момент ваша библиотека может помешать другому коду работать должным образом. Так что если ваш код полагается на srand После того как вы позвонили, вам нужно объяснить в своей документации, что вы хотите, чтобы код вызывающего абонента вызывал srand перед использованием ваших функций.

Насколько я знаю, нет возможности проверить, srand действительно был назван.

Могут быть и другие решения, если у вас есть ограничения в вашей среде. Например, в Glibc rand а также srandВы могли бы использовать rand_r который принимает указатель на seed переменная — так что вы можете иметь свою совершенно отдельную последовательность случайных чисел, которая не зависит от внешней «помощи».

2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector