Рассмотрим, как генерировать случайные числа в 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)… вот почему предыдущий пример всегда возвращал одно и то же число!