C++ Random

Da Andreabont's Wiki.

Il C++ offre una serie di tool atti alla generazione di numeri casuali.

Generatori

std::random_device

Il random device, è la fonte casuale di base, che può essere usata dai tool successivi.

std::random_device rd;
rd()         // Ritorna un numero casuale
rd.entropy() // Ritorna entropia disponibile
rd.min()     // Ritorna minimo valore ottenibile
rd.max()     // Ritorna massimo valore ottenibile

Mersenne Twister

Il C++ fornisce un generatore di numeri pseudocasuali che implementa l'algoritmo Mersenne Twister, usato come buon compromesso per la qualità dei numeri generati e velocità. E' possibile fornire in ingresso un random_device per migliorare la casualità dell'output.

std::random_device rd;
std::mt19937 gen(rd());      // Versione 32 bit
std::mt19937_64 gen64(rd()); // Versione 64 bit

E' possibile anche impostare il seed voluto:

gen.seed(1) // Valore singolo

std::seed_seq sseq{1, 2};
gen.seed(sseq); // Valore multiplo

Distribuzioni

Partendo dal generatore, è possibile ottenere una distribuzione voluta usando la rispettiva funzione:

std::uniform_int_distribution

Questa fornisce una distribuzione di numeri interi in un range definito. Vedere distribuzione discreta uniforme.

std::uniform_int_distribution<int> dis(1, 6);
dis(gen); // Ottiene distribuzione a partire dal generatore passato.

std::uniform_real_distribution

Questa fornisce una distribuzione di numeri reali in un range definito. Vedere distribuzione continua uniforme.

std::uniform_real_distribution<double> dis(0.0, 1.0);
dis(gen); // Ottiene distribuzione a partire dal generatore passato.

std::normal_distribution

Questa fornisce la distribuzione normale, con media e varianza dati. Vedere distribuzione normale.

std::normal_distribution<double> dis(5, 2);
dis(gen); // Ottiene distribuzione a partire dal generatore passato.

std::bernoulli_distribution

Questa fornisce la distribuzione di Bernoulli (true/false), probabilità di successo p data. Vedere distribuzione di Bernoulli.

std::bernoulli_distribution dis(0.5);
dis(gen); // Ottiene true o false a partire dal generatore passato.