C++:
Generazione di numeri casuali
Come fare:
Per generare numeri casuali in C++, di solito si utilizza l’intestazione <random>
, che è stata introdotta in C++11, offrendo un’ampia gamma di servizi per generare numeri casuali da varie distribuzioni.
#include <iostream>
#include <random>
int main() {
// Inizializza un motore casuale
std::random_device rd;
std::mt19937 gen(rd());
// Definisci l'intervallo [0, 99] incluso
std::uniform_int_distribution<> distrib(0, 99);
// Genera e stampa 5 numeri casuali nell'intervallo definito
for(int n=0; n<5; ++n)
std::cout << distrib(gen) << ' ';
return 0;
}
Questo esempio di codice inizializza un generatore di numeri casuali Mersenne Twister con un seme da std::random_device
. Quindi, definisce una distribuzione uniforme di interi nell’intervallo [0, 99] e infine stampa 5 numeri casuali da questa distribuzione.
L’output di esempio potrebbe apparire così, ma tieni presente che ogni esecuzione produrrà probabilmente risultati diversi:
45 67 32 23 88
Approfondimento:
Storicamente, la generazione di numeri casuali in C++ si affidava pesantemente alla funzione rand()
e alla funzione di seeding srand()
, trovate nell’intestazione <cstdlib>
. Tuttavia, questo approccio ha spesso ricevuto critiche per la sua mancanza di uniformità e prevedibilità nella distribuzione dei numeri generati.
L’introduzione dell’intestazione <random>
in C++11 ha segnato un notevole miglioramento, offrendo un sistema sofisticato per produrre numeri casuali. Le strutture fornite includono una varietà di motori (come std::mt19937
per Mersenne Twister) e distribuzioni (come std::uniform_int_distribution
per la distribuzione uniforme di interi) che possono essere combinati per soddisfare le specifiche esigenze del programmatore, portando a un comportamento più prevedibile, migliori prestazioni e una maggiore flessibilità.
Sebbene la libreria <random>
sia molto migliore rispetto al vecchio approccio rand()
, vale la pena notare che la generazione di numeri veramente casuali, specialmente per scopi crittografici, si affida ancora a considerazioni aggiuntive. Per le applicazioni crittografiche, dovrebbero essere utilizzate invece librerie progettate specificamente per la sicurezza, che spesso utilizzano fonti di entropia hardware.