В языке Си существуют следующие функции для работы со случайными числами (их
описание находится в заголовочном файле stdlib.h — это значит, что его необходимо подключать в начале программы):
n = rand(); получить случайное целое число в интервале от 0 до
RAND_MAX (это очень большое целое число — 32767)
srand (m); установить начальное значение случайной последовательности, равное m
Случайные числа в заданном интервале
Для практических задач надо получать случайные числа в заданном интервале [a,b]. Если
интервал начинается с нуля (a=0), можно использовать свойство операции взятия остатка от деления: остаток от деления числа на некоторое N всегда больше или равен нуля, но меньше N, то есть находиться в интервале [0,N-1]. Можно написать такую функцию
Int random (int N)
{
return rand() % N; // случайное число в интервале [0,N-1]
}
С ее помощью (вызывая ее много раз подряд) можно получать последовательность случайных чисел в интервале [0,N-1] с равномерным распределением.
Теперь попытаемся использовать эту функцию для интервала [a,b]. Очевидно, что формула
k = random(N) + a;
дает последовательность в интервале [a,a+N-1]. Поскольку нам нужно получить интервал
[a,b], сразу имеем b=a+N-1, откуда N=b-a+1. Поэтому
Для получения случайных целых чисел с равномерным распределением в интервале [a,b]
надо использовать формулу
k = random(b-a+1) + a;
Более сложным оказывается вопрос о случайных вещественных числах. Если разделить
результат функции rand() на RAND_MAX:
x = (float) rand() / RAND_MAX;
мы получим случайное вещественное число в интервале [0,1) ( при этом надо не забыть привести одно из этих чисел к вещественному типу, иначе деление одного целого числа на большее целое число будет всегда давать ноль ).
Длина интервала [0,1) такой последовательности равна 1, а нам надо получить интер-
вал длиной b-a. Если теперь это число умножить на b-a и добавить к результату a, мы получаем как раз нужный интервал.
Для получения случайных вещественных чисел с равномерным распределением в интервале
[a,b) надо использовать формулу
x = rand()*(b-a)/RAND_MAX + a;
До этого момента мы говорили только о получении случайных чисел с равномерным распределением. Как же получить неравномерное? На этот вопрос математика отвечает так: из равномерного распределения можно получить неравномерное, применив к этим данным некоторую математическую операцию. Например, чтобы основная часть чисел находилась в середине интервала, можно брать среднее арифметическое нескольких последовательных случайных чисел с равномерным распределением.
Снег на экране
Приведенная ниже программа генерирует случайное значение x в интервале [0,399],
случайное значение y в интервале [0,299] и проверяет цвет точки с координатами (x,y) .
Если эта точка черная, то ее цвет устанавливается случайный, а если нет — черный. Случайный цвет строится с помощью стандартной функции COLOR из красной (R), зеленой (G) и синей (B) составляющих, которые выбираются случайно в интервале [0,255].
• для определения того, была ли нажата какая-нибудь клавиша, используется функция
kbhit, которая возвращает 0, если клавиша не была нажата, и ненулевое значение, если
нажата любая клавиша. Для того, чтобы определить код этой клавиши, надо вызвать
функцию getch. Таким образом, цикл «пока не нажата клавиша» может выглядеть так:
while (! kbhit()) {... }
• для того, чтобы получить текущий цвет точки, используется функция getpixel.
Массивы
Основные понятия
Определение массива
Основное предназначение компьютеров не вычисления, как считают многие, а обработка
больших объемов данных. При размещении большого количества данных в памяти возникает такая проблема: надо научиться обращаться к каждой ячейке с данными отдельно. При этом очень сложно дать каждой ячейке собственное имя и при этом не запутаться. Выкручиваются из этой ситуации так: дают имя не ячейке, а группе ячеек, в которой каждая ячейка имеет номер.Такая область памяти называется массивом.
Массив – это группа ячеек памяти одинакового типа, расположенных рядом и имеющих
общее имя. Каждая ячейка в группе имеет уникальный номер.
При работе с массивами надо научиться решать три задачи:
• выделять память нужного размера под массив
• записывать данные в нужную ячейку
• читать данные из ячейки
Объявление массива
Чтобы использовать массив, надо его объявить – выделить место в памяти. Типом массива
называется тип массива это тип входящих в него элементов. Массивы могут быть разных типов— int, float, char, и т.д. Массив объявляют так же, как и обычные переменные, но после имени массива в квадратных скобках записывается его размер.
int A[10], B[20]; // 2 массива на 10 и 20 целых чисел
float C[12]; // массив из 12 вещественных чисел
При объявлении массива можно сразу заполнить его начальными значениями, перечисляя их внутри фигурных скобок:
int A[4] = { 2, 3, 12, 76 };
Если в списке в фигурных скобках записано меньше чисел, чем элементов в массиве, то
оставшиеся элементы заполняются нулями. Если чисел больше, чем надо, транслятор сообщает об ошибке. Например,
int A[4] = { 2 }; // последние три элементы равны 0
Для повышения универсальности программы размер массива лучше определять через константу. В этом случае для переделки программы для массива другого размера надо только поменять значение этой константы:
В таблице показаны примеры правильного и неправильного объявления массива.