next up previous
Next: About this document ... Up: Generare de numere aleatoare Previous: Apeluri POSIX

/dev/random

Dispozitivul special (de tip caracter) /dev/random poate fi folosit pentru generarea de numere complet aleatoare. La baza lui sta un pool de numere care sunt obtinute din operatiile efectuate de catre kernel asupra diverselor dispozitive hardware cu functionare asincrona (gen harddisk, floppy, seriala, placa de retea). Diferitele semnale trimise de acestea vin la intervale neregulate si complet independente de timp constituind baza pentru obtinerea unui intreg set de numere generate aleator.

Citirea de astfel de numere se face direct din dispozitiv (cu apeluri de tipul read). Intrucat la baza acestuia se afla un pool de numere generate aleator, exista posibilitatea (desi infima) ca acesta sa se goleasca, spre deosebire de apelul rand, unde algoritmul genereaza fara oprire un alt numar pseudo-aleator. Acelasi exemplu de fisiere prezentat mai sus a fost rescris pentru utilizarea dispozitivului /dev/random.

/*
 * fisier ce contine funtii de lucru cu numere aleatoare generate
 * prin intermediul apelurilor rand si srand
 */

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

void init_seed (void)
{
}

/*
 * obtinem numarul aleator citind din /dev/random; apoi il calibram
 * in intervalul [0, max)
 */

int get_rand (unsigned int max)
{
        int fd;
        unsigned int num;

        fd = open ("/dev/random", O_RDONLY);
        if (fd < 0) {
                perror ("open");
                exit (EXIT_FAILURE);
        }

        if (read (fd, &num, sizeof (num)) < 0) {
                perror ("read");
                exit (EXIT_FAILURE);
        }

        close (fd);

        return num % max;
}

Un fisier de test simplu pentru functiile de generare de numere aleatoare (atat varianta POSIX cat si cea cu /dev/random) ar fi

/*
 * caz de test pentru numere (pseudo)aleatoare
 */

#include <stdio.h>
#include <stdlib.h>

#include "myrand.h"

/*
 * vom genera o serie de 4 numere aleatoare si le vom afisa
 * la iesirea standard
 */

int main (void)
{
        int i;

        init_seed ();

        for (i = 0; i < 4; i++)
                printf ("Numar obtinut: %d\n", get_rand (100));

        return 0;
}

Desi folosirea fisierului special /dev/random produce numere total aleatoare, overhead-ul implicat de citirea informatiilor, comparativ cu simple operatii aritmetice folosite de apelurile POSIX, il fac o optiune tentanta numai in situatiile in care folosirea numerelor pseudo-aleatoare nu este satisfacatoare.


next up previous
Next: About this document ... Up: Generare de numere aleatoare Previous: Apeluri POSIX
Razvan Adrian Deaconescu 2005-10-01