Книга: Программирование для 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));
}

Оглавление книги


Генерация: 0.920. Запросов К БД/Cache: 4 / 1
поделиться
Вверх Вниз