rand()
генерирует равномерное (псевдо) случайное распределение.
Фактическое требование из C стандарта (3,7 МБ PDF), раздел 7.20.2.1, составляет:
Функция rand вычисляет последовательность псевдослучайных чисел в
диапазон от 0 до RAND_MAX .
где RAND_MAX, по крайней мере, 32767. Это, по общему признанию, расплывчато, но намерение состоит в том, что он дает вам равномерное распределение - и на практике это то, что на самом деле делают реализации.
Стандарт предоставляет пример реализации, но реализации C не требуют его использования.
На практике, конечно, есть лучшие генераторы случайных чисел. И одно конкретное требование для rand()
заключается в том, что он должен производить точно такую же последовательность чисел для данного семени (аргумент srand()
). Ваше описание не указывает на то, что это будет проблемой для вас.
Одна проблема заключается в том, что rand()
дает вам равномерно распределенные числа в фиксированном диапазоне. Если вы хотите, чтобы числа находились в другом диапазоне, вам нужно проделать дополнительную работу. Например, если RAND_MAX равен 32767, то rand()
может выдавать 32768 различных значений; вы не можете получить случайные числа в диапазоне 0,9 без отбрасывания некоторых значений, поскольку нет способа равномерно распределить эти 32768 различных значений в 10 сегментов одинакового размера.
Другие PRNG, вероятно, дадут вам лучшие результаты, чем rand()
, но они, вероятно, будут подвержены тем же проблемам.
Как обычно, comp.lang.c FAQ отвечает на этот вопрос лучше, чем я; см. вопросы с 13.15 по 13.21.