Numeri casuali in C++

Spesso nei nostri esercizi ci occorre estrarre dei numeri casuali in un determinato intervallo di valori per inizializzare vettori, variabili semplici o in generale per avanzare in un determinato gioco o test. Vediamo come fare!

Estrarre un numero casuale è piuttosto semplice. Partiamo dal presupposto o curiosità che un calcolatore per svariati motivi tecnologici non è esattamente capace di estrarre numeri casuali, ma solo pseudocasuali, che nella maggior parte delle applicazioni, i nostri esercizi inclusi, è perfettamente accettabile. Il problema dei numeri casuali propriamente detti è più strettamente legato alla crittografia e in quel caso si utilizzano strumenti hardware su misura (se sei curioso, leggi qui).

Nel nostro caso dobbiamo prima di tutto inizializzare un seme, una sorta di inizializzazione senza però la quale si estrarrebbe sempre lo stesso numero. Quindi è una procedura strettamente necessaria ma basta eseguirla una sola volta globalmente, ad esempio nella prima parte del main.  Srand ci assicura l’estrazione ripetuta di numeri differenti. L’uso di time(NULL) o time(0), aggiunge una sorta di casualità al tutto perché ad ogni lancio farebbe riferimento ad un orario differente del nostro pc.

La funzione rand possiamo poi usarla dove vogliamo, nel main o in una funzione, sicuri ci dia sempre un numero o sequenza di numeri differenti. Usiamo il mod % per impostare un valore limite e +1 per non partire da zero, se necessario.

#include <iostream>
#include <time.h>
#include <stdlib.h>

using namespace std;

int main() 
{
  int numero;

  //inizializzato una tantum per tutto il programma e/o funzioni
  srand(time(NULL));

  //estrae i numeri casuali da 1 a 90
  //cambiare l'estremo 90 o togliere +1 per partire da 0 
  numero = rand() % 90 +1;
  
  cout << numero << endl;
} 

Una applicazione tipica, come accennato, è inizializzare un vettore con valori casuali per poter testare magari la bontà di uno sviluppo/algoritmo. Potete personalizzare il seguente listato modificando la dimensione DIM del vettore  o del massimo valore estraibile MAX a seconda delle necessità. Qui riempiamo un vettore di 10 elementi con numeri estratti da 1 a 90 e stampiamo in modo semplice il vettore risultante.

#include <iostream>

using namespace std;

int main()
{
  #define DIM 10
  #define MAX 90

  int numero;
  int vettore[DIM];

  srand(time(NULL));


  for (int i=0; i < DIM; i++)
  {
    numero = rand() % MAX +1;
    vettore[i] = numero;
  }

  for (int i=0; i < DIM; i++)
  {
    cout << vettore[i] << " ";
  }
}

Ultima modifica 24 Marzo 2023