Статьи по c++

Случайные числа в C++: функции rand() и srand()

Рассмотрим, как генерировать случайные числа в C++.

В центре нашего внимания будет функция rand(), которая используется для генерации числа от 0 до RAND_MAX. Где RAND_MAX – это значение, которое меняется в зависимости от используемого компилятора (обычно 32767).

В следующем примере вы увидите, как сгенерировать число от 0 до 999:

#include<iostream> #include<cstdlib> using namespace std; int main() { // Генерируется случайное число от 0 до 999. cout<<rand()%1000<<endl; }
Code language: PHP (php)

Генерация случайного числа в пределах диапазона: оператор модуля (%)

Команда rand()%1000 генерирует целое число в диапазоне от 0 до 999.

Если использовать инструкцию rand()%N, то в действительности мы получим число от 0 до N-1.

Чтобы установить максимум, используется оператор модуля (%), который, как мы знаем, используется для вычисления остатка от целочисленного деления, и это объясняет, почему максимальное значение может быть N-1!

Так, любое число, делящееся на 5, может дать в качестве остатка 0, 1, 2, 3 и 4… оно не может дать 5, потому что иначе мы имели бы целочисленное деление без остатка!

Несколько примеров:

rand()%2 // генерирует число от 0 до 1 rand()%100 // генерирует число от 0 до 99 rand()%43 // генерирует число от 0 до 42 rand()%10+5 // генерирует число от 5 до 14
Code language: JavaScript (javascript)

В последней инструкции мы добавили +5 (это называется смещением) к обоим числам в диапазоне (меньшему и большему).

Случайное число всегда одно и то же!

Давайте попробуем сохранить, скомпилировать код, приведенный в начале статьи, и запустить программу.

Вы заметите, что каждый раз, когда вы запускаете код, вы всегда получаете одно и то же число!

Но как это возможно? Разве это не должен был быть генератор случайных чисел?

Объяснение этого явления связано с функцией rand(): она, по сути, не генерирует истинно случайное число, а просто возвращает следующее псевдослучайное значение в последовательности значений от 0 до RAND_MAX.

Поэтому для получения случайного числа необходимо изменить начальную точку (seed) этой последовательности с помощью функции srand().

Генерация случайного числа с помощью srand() и time()

Для этого нам нужно дополнить код, который мы видели ранее, функциями srand() и time().

Давайте посмотрим пример с использованием простого цикла for для создания не одного, а 10 случайных чисел:

#include<iostream> #include<cstdlib> #include<ctime> using namespace std; int main() { // Инициализируйте генератор псевдослучайных чисел. srand(time(NULL)); for(int i=0;i<10;i++) { // Генерируется случайное число от 0 до 9. cout<<rand()%10<<endl; } }
Code language: PHP (php)

Функция srand() используется для инициализации функции генерации случайных чисел: без нее программа всегда извлекала бы одни и те же случайные числа из одного и того же семени.

Трюк для рандомизации seed заключается в том, чтобы установить его с помощью time(NULL) или time(0), встроив соответствующую функцию, найденную в библиотеке ctime (которую мы включили в наш проект).

Обратите внимание, что в первом примере, предложенном в этой статье, функция srand() отсутствовала: каждый раз, когда используется rand() без выполнения программистом команды srand(), как если бы была установлена srand(1)… вот почему предыдущий пример всегда возвращал одно и то же число!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *