Generazione di numeri casuali

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.