2015-03-19 2 views
12

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

Рассмотрите возможность использования rand_r(...) вместо rand(...) для повышения безопасности потока.

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

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

Кто такой?

+5

Если возможно, используйте «новые» '' средства. «Ранд» довольно плох. [Интересно] (http://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful). –

ответ

11

Оба, вид.

Функция rand() определена стандартом C и была с первого такого стандарта в 1989/1990; он включен по ссылке в стандарте C++. Поскольку rand() зависит от состояния, он не является потокобезопасным.

Функция rand_r() была разработана в качестве альтернативы потоку -безопасности для rand(). Это не, определяемый стандартом ISO C или C++. Он был определен POSIX.1-2001, но помечен как устаревший POSIX.1-2008 (это означает, что он все еще определен стандартом POSIX, но может быть удален в будущей версии).

Реализации rand() и, следовательно, rand_r(), могут быть низкого качества. Есть гораздо лучшие генераторы псевдослучайных чисел. Для C++ библиотека <random> была добавлена ​​в C++ 11 и предоставляет несколько различных опций.

Если вы хотите максимальная портативность и вы не заботитесь слишком много о качестве или предсказуемости сгенерированных чисел и безопасности потоков не является проблемой, вы можете использовать srand() и rand(). В противном случае, если у вас есть реализация C++ 11, используйте функции, определенные в заголовке <random>. В противном случае обратитесь к документации вашей системы для других генераторов псевдослучайных чисел.

Литература: POSIX, <random> on cppreference.com.

+0

Возможно, стоит отметить, что случайный случай C++ 11 также существует в Boost для тех, кто не может использовать C++ 11, но может использовать Boost. – Morwenn

Смежные вопросы