Содержание

rand генератор случайных чисел

В языке С существует возможность сгенерировать случайное число. Для этой операции используется функция под названием rand(). Эта функция находиться в библиотечном файле - stdlib.h, следовательно для ее работы необходимо этот файл подключить с помощью диррективы #include. На место вызова rand() в программе, подставится случайное число в диапазоне от 0 до 32767.

Компьютер, в отличии от живого существа, не способен на ассоциативное мышление, поэтому функция rand() не получает число из воздуха, а работает, используя в качестве начальной точки – точку определенную при написании алгоритма генератора случайного числа, то есть некое постоянное число. Другими словами, опираясь на эту точку, при разных вызовах программы эта функция генерирует одно и то же число. Из этого можно сделать вывод: Для того, чтобы rand() при разных вызовах программы выдавал разные числа необходимо изменить начальную точку генерации.

Использование функции srand

Местоположение функции 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