Linguaggio C++

Libreria Random

Introduzione alla libreria random del C++: generatori moderni, distribuzioni casuali, mt19937 e creazione di numeri corretti e affidabili.

La libreria <random> è il sistema moderno del C++ per la generazione di numeri pseudo-casuali. È molto più potente, precisa e sicura rispetto alla vecchia funzione rand().

Fornisce:

  • generatori di numeri (mt19937, default_random_engine...)
  • distribuzioni (uniformi, normali, bernoulliane, ecc.)
  • supporto per numeri veramente casuali tramite random_device

1️⃣ Inclusione della libreria


#include <random>

2️⃣ Componenti della libreria random

La libreria si basa su tre concetti fondamentali:

ComponenteDescrizione
random_device Generatore hardware (o pseudo-hardware) vero casuale
Generatori mt19937, default_random_engine... producono sequenze deterministiche
Distribuzioni Definiscono il tipo di uscita: uniforme, gaussiana, poisson, ecc.

3️⃣ random_device – vera casualità


random_device rd;
cout << rd();   // numero casuale reale

Viene spesso usato per inizializzare generatori come mt19937.


4️⃣ mt19937 – Mersenne Twister

Il generatore più utilizzato: veloce, affidabile e con un periodo enorme (2^19937).


random_device rd;
mt19937 gen(rd());   // inizializzazione casuale

5️⃣ Distribuzione uniforme intera


uniform_int_distribution dist(1, 100);
int n = dist(gen);   // numero da 1 a 100

6️⃣ Distribuzione uniforme reale


uniform_real_distribution dist(0.0, 1.0);
double x = dist(gen);

7️⃣ Distribuzione normale (Gaussiana)


normal_distribution dist(0.0, 1.0);
double x = dist(gen);   // media 0, deviazione 1

8️⃣ Esempio completo


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

int main() {
    random_device rd;
    mt19937 gen(rd());
    uniform_int_distribution dist(1, 10);

    for (int i = 0; i < 5; i++) {
        cout << dist(gen) << endl;
    }
}
LABORATORIO

Generazione Moderna di Numeri Casuali

In questo laboratorio imparerai a usare i generatori moderni della libreria <random>, creando numeri uniformi, reali e normali grazie al generatore mt19937.


1 Generatore base

Inizializza un generatore mt19937 usando random_device.


random_device rd;
mt19937 gen(rd());

2 Intervallo personalizzato

Genera 20 numeri casuali tra 1 e 100.


uniform_int_distribution dist(1, 100);

for(int i=0; i<20; i++)
    cout << dist(gen) << endl;

3 Numeri reali uniformi

Genera numeri reali tra 0 e 1.


uniform_real_distribution dist(0.0, 1.0);

4 Esercizi

  • Simula il lancio di due dadi usando una distribuzione intera 1-6.
  • Genera 1000 numeri normali e calcola media e deviazione empirica.
  • Crea un programma che estrae una password casuale di 12 caratteri.
  • Simula un sorteggio tra 30 studenti.