Ответ 1
Оба, вроде.
Функция rand()
определяется стандартом C и была с первого такого стандарта в 1989/1990; он включается по ссылке в стандарте С++. Поскольку rand()
зависит от состояния, он не является потокобезопасным.
Функция rand_r()
была разработана как безопасная для потоков альтернатива rand()
. Он не определен стандартом ISO C или С++. Он был определен POSIX.1-2001, но помечен как устаревший POSIX.1-2008 (что означает, что он все еще определен стандартом POSIX, но может быть удален в будущей версии).
Реализации rand()
и, следовательно, rand_r()
могут быть низкими. Есть гораздо лучшие генераторы псевдослучайных чисел. Для С++ библиотека <random>
была добавлена в С++ 11 и предоставляет несколько различных параметров.
Если вам нужна максимальная переносимость, и вы не слишком заботитесь о качестве или предсказуемости сгенерированных номеров, а безопасность потоков не вызывает беспокойства, вы можете использовать srand()
и rand()
. В противном случае, если у вас есть реализация С++ 11, используйте функции, определенные в заголовке <random>
. В противном случае обратитесь к документации вашей системы для других генераторов псевдослучайных чисел.
Ссылки: POSIX, <random>
на cppreference.com.