Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lr3.doc
Скачиваний:
2
Добавлен:
08.11.2019
Размер:
99.84 Кб
Скачать

3.3. Генерация случайных чисел

Функция rand() генерирует псевдослучайное целое число в диапазоне от нуля до значения RAND_MAX. RAND_MAX –это константа, которая определена в <stdlib.h>.

Диапазон значений, непосредственно генерируемых rand, часто отличается от того, который необходим в конкретном приложении. Если вы хотите получить целое число из интервала [A..B], используйте соотношение

int x = A + rand() % (B+1-A);

Например, чтобы получить целое число в диапазоне от -100 до 100, нужно вычислить

x = -100+ rand() % 201;

В результате вычисления выражения rand() % 201, то есть взятия остатка от деления на 201, получим целое число в диапазоне от 0 до 200. Это называется масштабированием []. После этого мы сдвигаем диапазон генерируемых случайных чисел, отнимая 100 от предыдущего результата. Получается целое число в диапазоне от -100 до 100.

Приведем в качестве примера фрагмент программы, моделирующий 10 бросков шестигранной игральной кости:

for (i = 1; i <= 20; i++)

printf(“%4d”, 1+ rand()%6 );

При каждом вызове такой программы последовательность чисел будет повторяться. Чтобы получать разные последовательности следует задавать некий начальный параметр последовательности (это называется «рандомизация») при помощи функции

srand( число );

Для рандомизации часто используется такой прием []

srand(time(NULL));

Функция time() определяет текущее календарное время в секундах. То есть компьютер считывает показания внутренних часов, чтобы автоматически получить не определенное заранее значение.

4. Пример программы

Ниже приводится текст программы, осуществляющей формирование и запись в файл нескольких наборов неупакованных чисел, содержащих информацию о состоянии устройства для примера из лабораторной работы №2:

Устройство сообщает о своем состоянии с помощью нескольких чисел.

Например, пусть состояние устройства представляется в виде:

C – код состояния (число в диапазоне от 0 до 31);

F – признак ошибки (1/0) ;

B – признак занятости (0/1);

N – количество байт, переданных в последней операции (число в диапазоне от 0 до 255).

Эти числа объединяются в одно слово состояния устройства, формируемое таким образом:

№ разряда

15

14

13

12

11

10

09

08

07

06

05

04

03

02

01

00

Значение

C

C

C

C

C

0

F

B

N

N

N

N

N

N

N

N

Пример вызова программы:

Вызов для формирования файла с пятью наборами чисел:

$ ./lr33 -w lr33.dat 5

Вызов для чтения готового файла:

$ ./lr33 -r lr33.dat

Код состояния = 23

Признак ошибки = 0

Признак занятости = 0

Количество переданных байт = 6

…...............................

5. Контрольные вопросы

1. Что такое системный вызов?

2. Какие системные вызовы служат для открытия файла? Что такое дескриптор файла?

3. Как формируются права доступа к создаваемому файлу?

4. С помощью каких системных вызовов можно организовать запись в файл, чтение из файла? Какие возможны ошибочные ситуации при использовании этих системных вызовов?

5. Какая функция служит для обработки ошибок системных вызовов?

6. Для чего предназначены параметры функции main(int argc, char *argv[])?

7. Для чего предназначена функция atoi()?

8. Как сгенерировать случайное число в диапазоне от 0 до 255?

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]