libri-javascript-python

C++ random – La libreria del linguaggio C++ include alcune funzioni per il calcolo dei numeri pseudo casuali, ovvero dei numeri random.

Avevamo già studiato in C, come generare i numeri random in questa lezione: array con numeri random in C.

Quindi analizzeremo innanzitutto la funzione rand() in C++ che serve a generare dei numeri casuali.

La funzione rand() genera un numero che è compreso nell’intervallo tra 0 e RAND_MAX, dove RAND_MAX è un valore che cambia a seconda del compilatore usato, ad esempio nel caso di Dev C++ è 32767.

Per provarlo basta semplicemente scrivere questo piccolo programma in cui oltre all’header iostream includeremo anche l’header cstdlib.

#include <iostream>
#include <cstdlib>
using namespace std;

#define N 10

int main(){
cout<<"RAND_MAX:"<<RAND_MAX;
}

Ma la funzione rand() dà l’impressione che il numero sia casuale.

Infatti aggiungete questa linea di codice al programma precedente:

cout<<rand()<<endl;

Noterete che il numero generato, se mandate più volte in esecuzione il programma, è sempre lo stesso.

Questo succede perché il nostro numero casuale è prodotto a partire dallo stesso seme. Allora occorre intervenire proprio su questo per generare numeri casuali diversi.


Esempi c++ random

Per generare numeri casuali in C++ potremmo inizializzare i semi utilizzando la funzione srand(). Questa funzione inizializza il generatore di numeri con un valore passato come argomento.

Ad esempio srand(112233);

Facciamo dunque un esempio inserendo in un array dei numeri pseudo-casuali.

Creiamo due semi partendo da due valori diversi. Dopo con la funzione srand() passiamo i semi come argomento e poi con la funzione rand() generiamo dei numeri pseudo-casuali che inseriremo nei nostri array a e b.

#include <iostream>
#include <cstdlib>
using namespace std;

const int seme1 = 111222333; 
const int seme2 = 112233444; 

#define N 10

int main(){
	int a[N],b[N];
	int i;

	srand(seme1);
	for (i=0; i<N; i++){		
		a[i]=rand();
	}
	
	srand(seme2);
	for (i=0; i<N; i++){
		b[i]=rand();
	}		
	
	cout<<"stampa primo array"<<endl;
	for (i=0; i<N; i++){		
		   cout<<a[i]<<endl;
	}
		
	cout<<"stampa secondo array"<<endl;
	for (i=0; i<N; i++){		
		   cout<<b[i]<<endl;
	}
	return 0;	
}

Ma ogni volta che manderemo in esecuzione il programma avremo sempre gli stessi numeri.


Uso della funzione time()

La funzione time() restituisce il numero di secondi trascorsi dal 01 Gennaio 1970 rispetto alla data e all’ora corrispondenti all’invocazione di tale funzione.

Per utilizzare questa funzione devo includere l’header ctime.

Ecco quindi il listato completo d’esempio:

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

#define N 10

int main(){
	int a[N];
	int i;

	srand(time(NULL));
	for (i=0; i<N; i++){		
		a[i]=rand();
	}	
	
	cout<<"stampa array"<<endl;
	for (i=0; i<N; i++){		
		   cout<<a[i]<<endl;
	}

	return 0;	
}

In questo modo ogni volta che manderemo in esecuzione il programma, in istanti differenti, otterremo valori diversi.


Ottenere valori random in un determinato intervallo

Adesso vedremo come generare numeri in C++ random ma in un intervallo definito.

Se utilizziamo rand()%N visualizziamo i numeri compresi tra 0 ed N-1.

Quindi ad esempio rand()%10 restituisce i numeri da 0 a 9.

Se aggiungiamo un offset l’intervallo si può modificare, ad esempio rand()%10+1 restituisce tutti i numeri da 1 a 10 anziché da 0 a 9. In pratica aggiungiamo 1 ad entrambi i numeri del range.

Quindi se ad esempio volessimo generare i numeri da 10 a 20, considerando che rand()%11 genera valori da 0 a 10, allora dovremmo aggiungere l’offset 10.

Ecco il listato completo che mostra due array inizializzati uno con i numeri random da 1 a 10 e il secondo con i numeri random da 10 a 20.

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

#define N 10

int main(){
	int a[N],b[N];
	int i;

	srand(time(NULL));
	for (i=0; i<N; i++){		
		a[i]=rand()%10+1;
	}
	
	srand(time(NULL));
	for (i=0; i<N; i++){		
		b[i]=rand()%11+10;
	}				
	
	cout<<"stampa primo array"<<endl;
	for (i=0; i<N; i++){		
		   cout<<a[i]<<endl;
	}
	
	cout<<"stampa secondo array"<<endl;
	for (i=0; i<N; i++){		
		   cout<<b[i]<<endl;
	}
		
	return 0;	
}

Questi sono solo alcuni possibili esempi sui numeri C++ random, più avanti vi mostrerò altre possibili applicazioni.

Alcuni link utili

Indice argomenti linguaggio C++

Array in C++

Passaggio di parametri per valore o per riferimento

Equazioni di secondo grado in C++

Le variabili globali e locali in C++

Uso delle funzioni in C++

Funzioni in C++

Definizione di funzioni in C++

Libreria cmath

Come usare il for in C++

Massimo tra n numeri in C++

Iterazioni in C++

Ciclo while in C++

Ciclo do while

Operatori logici in C++

Esercizi con switch case in C++

If else in C++

Casting in C++

Successione di Fibonacci in C++