17: Funzioni utili (rand, srand)

Bentornati amanti del C. Dopo l’articolo della scorsa settimana che si concentrava soprattutto su esercizi per allenare la vostra capacità di elaborare e realizzare una soluzione per affrontare un problema, oggi torniamo sulle nostre vecchie funzioni.
Per essere precisi oggi vi parleremo delle funzioni “preconfezionate” che avevamo già accennato quando avevamo presentato le funzioni, vi allego la pagina, e le funzioni utili che tutti dovrebbero conoscere. Dunque, siete pronti? Partiamo.



Le funzioni della libreria matematica

Le funzioni di questa libreria permettono al programmatore di eseguire certi tipi di calcoli matematici senza creare delle funzione apposite perché sono già state create da altri programmatori e racchiuse nella libreria stessa. Normalmente le funzioni sono utilizzate scrivendo il nome delle stesse seguite da una parentesi tonda aperta , dall’argomento ( oppure dalla lista di argomenti separati da una virgola) della funzione e da una parentesi tonda chiusa. Passiamo agli esempi. Se dovessimo calcolare la radice quadrata di 900,0 e visualizzare la risposta sullo schermo allora la cosa migliore sarebbe invocare la funzione sqrt.

printf("%.2f", sqrt(900.0) );  /*%.2f   significa che ci aspettiamo un risultato
 di tipo float che si fermi alla seconda cifra decimale*/

Nel momento il cui questa istruzione sarà eseguita, sarà invocata la funzione dalla libreria matematica per calcolare la radice quadrata del numero contenuto tra le parentesi tonde (900.0). L’istruzione precedente visualizzerà come risultato 30,00.
Le altre funzioni presenti nella libreria matematica potete trovarle qua.
P.S Includete il file di intestazione matematico, utilizzando la direttiva del preprocessore #include math.h

Funzioni Utili 

Questa volta proveremo qualcosa di più divertente: creeremo un programma che simuli 20 lanci di un dado a sei facce e visualizzi il risultato. Gli elementi per creare questo programmi sono pochi,  l’unico nostro limite sembra essere il fatto di generare numeri casuali… ebbene esiste una funzione anche per questo! L’elemento della casualità può essere introdotto nelle applicazioni per computer utilizzando la funzione rand della libreria standard C disponibile tramite il file di intestazione .
Consideriamo la seguente istruzione:

i = rand();

La funzione rand genera un numero compreso tra 0 e un Max che è 32767, che è il valore massimo per un intero di due byte. Però per il nostro programma ci servono dei numeri casuali che varino da 1 a 6 (facce del dado). Quindi utilizzeremo l’operatore resto (%) in congiunzione con il rand nel modo seguente

rand() % 6

questa istruzione genera numeri compresi nell’intervallo da 0 a 5. Questa operazione si chiama riduzione in scala, mentre il numero 6 è detto fattore di scala. Dunque per ottenere il nostro intervallo desiderato sommeremo un 1 all’istruzione precedente.

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

int main (void)
{
int i;  //contatore

for(i=1;i<=20;i++)  //iterazione per 20 volte
{
printf("%10d", 1 + (rand() % 6) ); //genera un numero casuale da 1 a 6

if(i % 5 == 0) {
printf("\n");  }
}
return 0;
}

Ora proviamo a lanciare il dado a sei facce 5000 volte e a contare quante volte sono usciti i valori da 1 a 6.

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

int main(void)  {
int frequenza1 = 0;  // contatore relativo al punteggio 1
int frequenza2 = 0;
int frequenza3 = 0;
int frequenza4 = 0;
int frequenza5 = 0;
int frequenza6 = 0;

int lanci;
int faccia;

for(lanci=0;lanci<5000;lanci++)  {
faccia= 1 + rand()  % 6 ;

switch(faccia)  {
case 1:  //è uscito 1 sul dado
frequenza1++;
break;
case 2:  //è uscito 2 sul dado
frequenza2++;
break;
case 3:  //è uscito 3 sul dado
frequenza3++;
break;
case 4:  //è uscito 4 sul dado
frequenza4++;
break;
case 5:  //è uscito 5 sul dado
frequenza5++;
break;
case 6:  //è uscito 6 sul dado
frequenza6++;
break;
}
}

printf("%s%13s\n", "Faccia", "Frequenza");
printf("1%13d\n", frequenza1 ) ;
printf("2%13d\n", frequenza2 ) ;
printf("3%13d\n", frequenza3 ) ;
printf("4%13d\n", frequenza4 ) ;
printf("5%13d\n", frequenza5 ) ;
printf("6%13d\n", frequenza6 ) ;

return 0;
}

Se provate a eseguire più volte il primo programma proposto vedrete come la sequenza di numeri generati si ripetono. Ma non erano numeri casuali? In realtà la funzione rand genera dei numeri pseudocasuali. Si potrebbe pensare che siano casuali ma il realtà la sequenza si ripeterà ogni volta che il programma sarà eseguito. Ma non preoccupatevi, esiste un modo per sistemare tutto. Il programma, una volta messo a punto, produrrà numeri casuali ad ogni sua esecuzione. Questa operazione si chiama randomizzazione ed è eseguita con la funzione srand della libreria standard che riceve come argomento intero un unsigned e insemina la funzione rand, in modo da indurla a generare numeri casuali ad ogni esecuzione del programma.

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

int main (void)
{
int i;
unsigned seme; //numero utilizzato come seme per il generatore di numeri casuali
printf("Inserisci il seme per il generatore\t");
scanf("%u", &seme); 
srand(seme); 

for(i=1;i<=20;i++)
{
printf("%10d", 1 + (rand() % 6) ); //genera un numero casuale da 1 a 6

if(i % 5 == 0) {
printf("\n");  }
}
return 0;
}

Eseguiamo diverse volte il programma e analizziamo i risultati. Ogni volta si ottiene una sequenza diversa di numeri ad ogni esecuzione del programma, purché venga fornito un seme differente.
Se volessimo invece lasciar perdere l’idea di immettere ogni volta il seme per generare numeri casuali, allora, potremmo usare questa istruzione:

srand( time(NULL));
Questa indurrebbe il computer a leggere il suo orologio interno per ottenere automaticamente un valore per il seme. La funzione time restituisce l’ora corrente del giorno espressa in secondi. Questo numero sarà convertito in un intero senza segno e utilizzato come seme per il generatore di numeri casuali.  La funzione time riceverà come argomento NULL (normalmente time è in grado di fornire al programmatore una stringa che rappresenta l’ora del giorno, il NULL disabilità questa capacità). Il prototipo per time è in

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main (void)
{
int i;  //contatore
srand(time(NULL));
for(i=1;i<=20;i++)  //iterazione per 20 volte
{
printf("%10d", 1 + (rand() % 6) ); //genera un numero casuale da 1 a 6

if(i % 5 == 0) {
printf("\n");  }
}
return 0;
}

Per oggi è tutto. Se avete domande scriveteci pure. Ci rivediamo al prossimo articolo.

Please follow and like us: