Во-первых, srand()
не получает семя, оно устанавливает семя.Заполнение является частью использования любого генератора псевдослучайных чисел (PRNG).При засевании последовательность чисел, которую PRNG производит из этого начального числа, является строго детерминированной, потому что (большинство?) Компьютеров не имеют средств для генерации истинных случайных чисел.Изменение вашего PRNG не остановит повторяемость последовательности от начального числа, и, действительно, это хорошо, потому что возможность генерировать одну и ту же последовательность псевдослучайных чисел часто полезна.
Так что, если всеPRNG делятся этой функцией с rand()
, почему rand()
считается плохим?Ну, это сводится к псевдо-части псевдослучайного.Мы знаем, что PRNG не может быть действительно случайным, но мы хотим, чтобы он вел себя как можно ближе к генератору истинных случайных чисел, и есть различные тесты , которые можно применить, чтобы проверить, насколько похожа последовательность PRNGк истинной случайной последовательности.Хотя его реализация не определена стандартом, rand()
в каждом обычно используемом компиляторе использует очень старый метод генерации, подходящий для очень слабого аппаратного обеспечения, и результаты, которые он дает довольно плохо в этих тестах.С тех пор было создано много лучших генераторов случайных чисел, и лучше выбрать тот, который соответствует вашим потребностям, а не полагаться на некачественный генератор, который может быть предоставлен rand()
.
, который подходит для ваших целейзависит от того, что вы делаете, например, вам может потребоваться криптографическое качество или многомерная генерация, но для многих случаев, когда вы просто хотите, чтобы вещи были достаточно равномерно случайными, быстрая генерация и деньги не зависели от качестваиз результатов вы, вероятно, хотите генератор xoroshiro128 + .В качестве альтернативы вы могли бы использовать один из методов в заголовке C ++ <random>
, но предлагаемые генераторы не являются современными, и теперь гораздо лучше, но они все еще достаточно хороши для большинства целей иочень удобно.
Если деньги находятся на линии (например, для перетасовки карт в онлайн-казино и т. д.) или вам необходимо криптографическое качество, вам необходимо тщательно исследовать соответствующие генераторы и убедиться, что они точно соответствуют вашим конкретным потребностям..