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:
| Componente | Descrizione |
|---|---|
| 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.
- Libreria
<random> random_deviceemt19937- Distribuzioni uniformi e gaussiane
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.