В языке С существует возможность сгенерировать случайное число. Для этой операции используется функция под названием rand(). Эта функция находиться в библиотечном файле - stdlib.h, следовательно для ее работы необходимо этот файл подключить с помощью диррективы #include. На место вызова rand() в программе, подставится случайное число в диапазоне от 0 до 32767.
Компьютер, в отличии от живого существа, не способен на ассоциативное мышление, поэтому функция rand() не получает число из воздуха, а работает, используя в качестве начальной точки – точку определенную при написании алгоритма генератора случайного числа, то есть некое постоянное число. Другими словами, опираясь на эту точку, при разных вызовах программы эта функция генерирует одно и то же число. Из этого можно сделать вывод: Для того, чтобы rand() при разных вызовах программы выдавал разные числа необходимо изменить начальную точку генерации.
Местоположение функции srand - библиотека stdlib.h.
Функция srand устанавливает начальную точку для генерации случайных чисел и обладает следующим синтаксисом:
void srand(unsigned int start)
Параметр start, который принимает функция, и есть - новая точка для генерации случайного числа.
Местоположение функции - библиотека time.h.
У функции time есть несколько предназначений и подробно разбирать мы ее не будем. Возьмем только то, что необходимо нам для работы. А, именно, если функцию time вызвать с параметром NULL, то на место своего вызова в программе, эта функция вернет количество миллисекунд прошедших с 1 января 1970 года. Согласитесь, что эта величина каждый раз будет разной. А, это - как раз то, что мы искали. "Соберем" полученную информацию в единое целое и получится:
srand(time(NULL));
Функция srand устанавливает в качестве стартовой точки число, представляющее собой количество, миллисекунд прошедших с 1 января 1970 года. Попробуем:
#include<iostream> #include<stdlib.h>// в этом файле содержатся функции rand и srand #include<time.h>// в этом файле содержится функция time using namespace std; void main() { srand(time(NULL)); int a; //генерация случайного числа и запись его в переменную a a=rand(); cout<<a<<"\n"; }
Набрав пример, вы, конечно, убедились, что теперь при разных запусках программы генерируются разные числа, но и этом возможности генератора не исчерпываются.
Числа, которые получаются путем вызова функции rand, находятся в диапазоне от 0 до 32767. Но, ведь нам не всегда требуется такой масштабный разброс данных. Что делать, если необходимо генерировать числа от 0 до 10 или от 0 до 100 и так далее?! На помощь, в таких случаях, приходит старое, доброе - Деление по модулю (вычисление остатка от деления).
Возьмем для примера произвольное число - 23. Согласитесь, что какое бы число вы не разделили на 23 по модулю, вы получите либо 0 (если остатка нет), либо остаток в диапазоне от 1 до 22. Этим свойством мы и воспользуемся, разделив сгенерированное случайное число по модулю:
int a=rand()%23;
На основании этого правила можно вывести формулу:
ЧИСЛО В ДИАПАЗОНЕ ОТ НУЛЯ ДО Х: rand() % X
Но, диапазон не всегда начинается с нуля. Пусть нам необходим диапазон от 11 до 16. Все просто. Необходимо сгенерировать числа от 0 до 5 (разница между 16 и 11), а потом "сдвинуть" полученный результат на 11 единиц.
int a=rand()%5+11;
И, на основании уже модифицированного правила можно вывести формулу:
ЧИСЛО В ДИАПАЗОНЕ ОТ Y ДО Х: rand() % (X-Y) + Y