Книга: Программирование для Linux. Профессиональный подход
Листинг 6.1. (random_number.c) Генерирование случайного числа с помощью файла /dev/random
Листинг 6.1. (random_number.c) Генерирование случайного числа с помощью файла /dev/random
#include <assert.h>
#include <sys/stat.h>
#include <sys/types.h
#include <fcntl.h>
#include <unistd.h>
/* Функция возвращает случайное число в диапазоне от MIN до МАХ
включительно. Случайная последовательность байтов читается из
файла /dev/random. */
int random_number(int min, int max) {
/* Дескриптор файла /dev/random сохраняется в статической
переменной, чтобы не приходилось повторно открывать файл
при каждом следующем вызове функции. */
static int dev_random_fd = -1;
char* next_random_byte;
int bytes_to_read;
unsigned random_value;
/* Убеждаемся, что аргумент MAX больше, чем MIN. */
assert(max > min);
/* Если функция вызывается впервые, открываем файл /dev/random
и сохраняем его дескриптор. */
if (dev_random_fd == -1) {
dev_random_fd = open("/dev/random", O_RDONLY);
assert(dev_random_fd != -1);
}
/* Читаем столько байтов, сколько необходимо для заполнения
целочисленной переменной. */
next_random_byte = (char*)&random_value;
bytes_to_read = sizeof(random_value);
/* Цикл выполняется до тех пор, пока не будет прочитано
требуемое количество байтов. Поскольку файл /dev/random
заполняется в результате пользовательских действий,
при длительном отсутствии активности операция чтения
может быть заблокирована или возвращать
лишь один байт за раз. */
do {
int bytes_read;
bytes_read =
read(dev_random_fd, next_random_byte, bytes_to_read);
bytes_to_read -= bytes_read;
next_random_byte += bytes_read;
} while (bytes_to_read > 0);
/* Вычисляем случайное число в правильном диапазоне. */
return min + (random_value % (max - min + 1));
}
- Листинг 6.1. (random_number.c) Генерирование случайного числа с помощью файла
- Листинг 10.1. (simpleid.c) Отображение идентификаторов пользователя и группы
- Повышение производительности приложений с помощью хранимых процедур
- Тестирование Web-сервиса XML с помощью WebDev.WebServer.exe
- Sequence number
- Организация пользователей в группы с помощью ролей
- Эффективная работа с временными файлами сортировки
- Единое имя файла параметров InterBase
- Параметры конфигурационного файла InterBase
- Числа с плавающей точкой
- 6. Совершенные числа
- 13. Зарабатываем на своих файлах: файлообменники, загружаеми получаем процент за скачивание