Должен ли я использовать rand() или rand_s()?

Я пытаюсь получить случайное число в С++, и я использую rand(). Это то, что cpplint говорит:

Для улучшения безопасности потоков используйте rand_r(...) вместо rand(...).

Я переключаюсь на rand_r, и это то, что cppcheck говорит:

Вызывается устаревшая функция 'rand_r'. Вместо этого рекомендуется использовать функцию "rand".

Кто прав?

Ответ 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.