double arrow

Функции для работы со случайными числами


В языке Си существуют следующие функции для работы со случайными числами (их

описание находится в заголовочном файле 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

Для повышения универсальности программы размер массива лучше определять через константу. В этом случае для переделки программы для массива другого размера надо только поменять значение этой константы:

В таблице показаны примеры правильного и неправильного объявления массива.


Сейчас читают про: