Инструменты пользователя

Инструменты сайта


rand

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

rand [2010/07/05 01:34] (текущий)
Строка 1: Строка 1:
 +====== rand ======
 +**rand** - генератор случайных чисел.
  
 +В языке С существует возможность сгенерировать случайное число. Для этой операции используется функция под названием rand(). Эта функция находиться в библиотечном файле - **stdlib.h**,​ следовательно для ее работы необходимо этот файл подключить с помощью диррективы #include. На место вызова rand() в программе,​ подставится случайное число в диапазоне от 0 до 32767.
 +
 +Компьютер,​ в отличии от живого существа,​ не способен на ассоциативное мышление,​ поэтому функция rand() не получает число из воздуха,​ а работает,​ используя в качестве начальной точки – точку определенную при написании алгоритма генератора случайного числа, то есть некое постоянное число. Другими словами,​ опираясь на эту точку, при разных вызовах программы эта функция генерирует одно и то же число. Из этого можно сделать вывод: Для того, чтобы rand() при разных вызовах программы выдавал разные числа необходимо изменить начальную точку генерации.
 +====== Использование функции srand ======
 +
 +Местоположение функции **srand** - библиотека stdlib.h. ​
 +
 +Функция srand устанавливает начальную точку для генерации случайных чисел и обладает следующим синтаксисом: ​
 +<​file>​
 +void srand(unsigned int start)
 +</​file>​
 +Параметр start, который принимает функция,​ и есть - новая точка для генерации случайного числа.
 +  * **Использование функции [[time]]**.
 +Местоположение функции - библиотека time.h. ​
 +
 +У функции time есть несколько предназначений и подробно разбирать мы ее не будем. Возьмем только то, что необходимо нам для работы. А, именно,​ если функцию time вызвать с параметром NULL, то на место своего вызова в программе,​ эта функция вернет количество миллисекунд прошедших с 1 января 1970 года. Согласитесь,​ что эта величина каждый раз будет разной. А, это - как раз то, что мы искали. "​Соберем"​ полученную информацию в единое целое и получится: ​
 +<​file>​
 +srand(time(NULL));​
 +</​file>​
 +Функция srand устанавливает в качестве стартовой точки число, представляющее собой количество,​ миллисекунд прошедших с 1 января 1970 года. Попробуем: ​
 +<​file>​
 +#​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";​
 +}
 +</​file>​
 +
 +Набрав пример,​ вы, конечно,​ убедились,​ что теперь при разных запусках программы генерируются разные числа, но и этом возможности генератора не исчерпываются.
 +====== Установка диапазона для генератора ======
 +Числа, которые получаются путем вызова функции rand, находятся в диапазоне от 0 до 32767. Но, ведь нам не всегда требуется такой масштабный разброс данных. Что делать,​ если необходимо генерировать числа от 0 до 10 или от 0 до 100 и так далее?​! На помощь,​ в таких случаях,​ приходит старое,​ доброе - [[%-деление по модулю]]. ​
 +
 +Возьмем для примера произвольное число - 23. Согласитесь,​ что какое бы число вы не разделили на 23 по модулю,​ вы получите либо 0 (если остатка нет), либо остаток в диапазоне от 1 до 22. Этим свойством мы и воспользуемся,​ разделив сгенерированное случайное число по модулю: ​
 +<​file>​
 +int a=rand()%23;​
 +</​file>​
 +На основании этого правила можно вывести формулу:​
 +<​file>​
 +ЧИСЛО В ДИАПАЗОНЕ ОТ НУЛЯ ДО Х:
 +
 + rand() % X
 +</​file>​
 +Но, диапазон не всегда начинается с нуля. Пусть нам необходим диапазон от 11 до 16. Все просто. Необходимо сгенерировать числа от 0 до 5 (разница между 16 и 11), а потом "​сдвинуть"​ полученный результат на 11 единиц.
 +
 +<​file>​
 +int a=rand()%5+11;​
 +</​file>​
 +И, на основании уже модифицированного правила можно вывести формулу:​
 +<​file>​
 +ЧИСЛО В ДИАПАЗОНЕ ОТ Y ДО Х:
 +
 + rand() % (X-Y) + Y
 +</​file>​
rand.txt · Последние изменения: 2010/07/05 01:34 (внешнее изменение)