Для случайного использования случайных чисел (например, в большинстве однопользовательских игр или в эстетических целях) rand
может быть достаточным, особенно если ваше приложение не заботится о повторяемости случайных чисел во времени или на разных компьютерах..
Однако для более серьезного использования случайных чисел, таких как научное моделирование, я отсылаю вас к другому моему ответу , где я объясняю, что проблема с rand
/srand
означает, что rand
-
- использует неуказанный алгоритм RNG, однако
- позволяет инициализировать RNG с
srand
для повторяемой "случайности".
Эти два момента, взятые вместе, затрудняют способность реализаций улучшать реализацию ГСЧ;изменение того факта, что RNG не позволит достичь повторяющейся «случайности», особенно если приложение обновляет до более поздней версии библиотеки времени выполнения C того же поставщика или скомпилировано с реализациями библиотеки различными поставщиками.Первый пункт также означает, что никакое конкретное качество случайных чисел не гарантируется.Другая проблема состоит в том, что srand
допускает только относительно небольшие начальные числа - на практике не более 32 бит.
Однако, даже если приложение не заботится о повторяемой "случайности", тот факт, что rand
указывает, что он ведет себя по умолчанию так, как если бы srand(1)
вызывался (и, таким образом, на практике генерирует ту же «случайную» последовательность по умолчанию), что делает использование rand
более трудным для использования, чем могло бы быть.
Лучшим подходом для некриптографических случайных чисел является использование библиотеки PRNG -
- , которая использует автономные PRNG, которые поддерживают свое собственное состояние (например, в одном
struct
) и не затрагивают глобальныесостояние и - , который реализует алгоритм PRNG, детали которого известны приложению.
Я перечисляю несколько примеров высококачественных алгоритмов PRNG для некриптографического случайногочисло.