12. Funzione random()

Sono detti numeri pseudo-casuali (in inglese pseudo-random numbers) i numeri generati da un algoritmo deterministico che produce una sequenza con proprietà statistiche del tutto simili a quelle di una sequenza di numeri generata da un processo casuale (ad esempio il lancio di un dado o l'estrazione di un bussolotto da un'urna). 

Un algoritmo deterministico è un algoritmo che, fissato l'input, si comporta in modo del tutto prevedibile. In altri termini, se viene eseguito più volte, ricevendo lo stesso input produce lo stesso output.

Un esempio di sequenza di numeri pseudo-casuali è data dalle cifre decimali di Pi greco: questa sequenza, infatti, soddisfa tutte le proprietà statistiche di casualità oggi note.

Per la generazione di numeri pseudo-casuali il linguaggio C mette a disposizione la funzione rand() definitita in stdlib.h.

Tale funzione restituisce un numero intero compreso tra 0 e il valore definito dalla costante RAND_MAX, definita in stdlib.h.

La funzione rand() "estrae" ad ogni chiamata un numero pseudo-casuale da una sequenza generata a priori secondo un algoritmo piuttosto complesso.

La generazione della sequenza è influenzata dal valore del seme che viene utilizzato dall'algoritmo.

Per la generazione della sequenza di numeri pseudo-casuali il C mette a disposizione la funzione srand(), anch'essa inclusa in stdlib.h, che accetta come argomento un valore numerico intero che viene utilizzato come seme.

Fornendo lo stesso seme alla funzione srand(), verrà prodotta la stessa sequenza di numeri casuali.

Per far sì che ad ogni esecuzione di un programma venga effettivamente generata una sequenza di numeri imprevedibile, è consuetudine passare come seme alla funzione srand() un numero intero calcolato sulla base dell'ora corrente, con una precisione spinta fino ai secondi.

La funzione time(), definita in time.h, restituisce il numero di secondi trascorsi dal giorno 1/1/1970.


#include <stdio.h>

#include <stdlib.h>

#include <time.h>

int main()

{

    int i;

    srand(time(NULL));

    for(i=0; i<10; i++)

        printf("%d ", rand()%100);

    return 0;

}


#include <stdlib.h>

#include <time.h>

Le funzioni srand() e rand() richiedono il file di include <stdlib.h>.

La funzione time() richiede il file di include <time.h>.

srand(time(NULL));

Per selezionare una sequenza pseudo-casuale occorre richiamare la funzione srand() passando come parametro un intero. Potremmo ad esempio effettuare la seguente invocazione:

srand(77);

dove 77 è un numero intero scelto in modo arbitrario.

Per far sì che ad ogni invocazione di un programma sia selezionata una sequenza pseudo-casuale differente è consuetudine passare un numero collegato alla data corrente.

time(NULL) restituisce il numero di secondi dal 1/1/1970. NULL è  una costante predefinita che vale 0.

printf("%d ", rand()%100);

La funzione rand() restituisce un numero pseudo-casuale in un intervallo molto ampio, esattamente tra 0 e RAND_MAX (quest'ultima è una costante che dipende dal sistema su cui si opera e normalmente vale 32767). Per far sì che il numero pseudo-casuale sia definito in un range più piccolo si usa l'operatore modulo (%).

In questo caso la printf(), in ogni ciclo, mostrerà un numero nell'intervallo 0 - 99.