Preparazione di una funzione per la generazione di numeri casuali




Nel seguito del corso useremo spesso la funzione per generare numeri casuali; la dichiarazione di questa funzione si trova all'interno del file
stdlib.h.


La funzione va utilizzata in questo modo:


(1) inserire, in qualsiasi punto del programma UNA sola chiamata alla funzione

void srand(unsigned int)


(2) richiamare, ogni volta in cui abbiamo bisogno di un numero casuale, la funzione

int rand(void)

la quale restituisce un intero positivo compreso tra 0 ed il numero RAND_MAX, estremi inclusi.


Il nome RAND_MAX identifica il massimo intero positivo che può essere restituito dalla funzione ed è fissato (la sua definizione si trova nel file
stdlib.h) da chi ha impostato il compilatore e NON VA ALTERATO PER NESSUN MOTIVO !


Facciamo un esempio:



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

int main()
{int numero_casuale;
 
srand(5748957);
 numero_casuale =
rand();
 printf("\n il numero casuale ottenuto e\' : %d \n",numero_casuale);
 printf("\nIl massimo numero casuale ottenibile con rand() e\' : %d",RAND_MAX);
 return 0;}



In futuro sarà necessario generare numeri casuali con queste caratteristiche:

(1) potranno essere di tipo intero o di tipo double

(2) dovranno variare tra un valore minimo ed un valore massimo


Visto che la funzione rand() non soddisfa queste caratteristiche, costruiamo due funzioni che ci permettano di generare numeri casuali, sia di tipo intero che di tipo decimale, compresi tra due estremi fissati arbitrariamente. Tali funzioni vanno salvate in un file che potremo richiamare mediante una direttiva
#include nel momento in cui, durante le prossime lezioni, sia necessario generare numeri casuali.


L'implementazione delle funzioni si basa su questo ragionamento:

(a) un numero, num, compreso tra estremi arbitrari, min e max, estremi inclusi, può essere scritto come num = valore + min (supponendo che valore sia compreso tra 0 e (max - min + 1)).

(b) il problema si riduce quindi a generare numeri casuali compresi tra 0 e (max - min), estremi inclusi

(c) rand() produce numeri casuali compresi tra 0 e RAND_MAX (estremi inclusi); devo perciò fare in modo di ridurre l'intervallo (SENZA ALTERARE RAND_MAX). Per ottenere questo risultato si possono usare due metodi.


/*    inizio del file       */


/*                     *****************************

Attenzione ! la chiamata a srand() va effettuata nel file da cui si richiama una delle due funzioni

                        *****************************      */

#include <stdlib.h>



int int_rand(int,int) // generatore di numeri casuali di tipo intero

double doub_rand(double,double)
// generatore di numeri casuali di tipo double


int int_rand(int min,int max)
{int numero_casuale;
 int differenza;
 differenza = (max - min) + 1;
 numero_casuale = rand() % differenza ;
 numero_casuale = numero_casuale + min ;
 return numero_casuale;
}

double doub_rand(double min,double max)
{double numero_casuale,differenza;
 differenza = (max - min);
 numero_casuale = (rand()/RAND_MAX) * differenza;
 numero_casuale += min ;
 return doub_casuale;
}

/*    fine del file       */