Generazione di numeri casuali

Haskell:
Generazione di numeri casuali

Come fare:

Per generare numeri casuali in Haskell, si utilizza tipicamente il pacchetto random, che fa parte della Haskell Platform. Ecco una guida passo dopo passo:

Prima di tutto, assicurati di avere il pacchetto random installato. Se non lo hai, puoi ottenerlo tramite Cabal o Stack.

Generare un Numero Casuale

Per generare un semplice numero casuale, puoi usare la funzione randomRIO, che produce un valore casuale all’interno di un intervallo specificato.

import System.Random (randomRIO)

main :: IO ()
main = do
  randomNumber <- randomRIO (1, 10) :: IO Int
  putStrLn $ "Numero casuale: " ++ show randomNumber

Generare una Lista di Numeri Casuali

Generare una lista di numeri casuali è leggermente più complesso ma comunque semplice:

import System.Random (randomRIO)

randomList :: Int -> IO [Int]
randomList 0 = return []
randomList n = do
  r <- randomRIO (1, 100)
  rs <- randomList (n-1)
  return (r:rs)

main :: IO ()
main = do
  numeri <- randomList 5
  print numeri

Questo frammento di codice crea una funzione randomList che genera una lista di interi casuali. Sostituisci (1, 100) con l’intervallo desiderato.

Approfondimento

Il pacchetto random di Haskell fornisce un generatore di numeri pseudo-casuali (PRNG), il che significa che i numeri generati non sono veramente casuali ma possono sembrarlo per molte applicazioni. Il nucleo della capacità di generazione casuale di Haskell risiede nella classe di tipo RandomGen, che astrae diversi metodi di generazione di numeri casuali, e nella classe di tipo Random, che include tipi che possono essere generati casualmente.

Storicamente, l’approccio di Haskell alla generazione di numeri casuali ha enfatizzato la purezza e la riproducibilità. Ecco perché le operazioni che coinvolgono la casualità sono gestite esplicitamente nel monade IO o richiedono il passaggio e l’aggiornamento manuale degli stati del generatore — per mantenere la trasparenza referenziale.

In certe applicazioni, come la crittografia, i numeri pseudo-casuali generati dal PRNG predefinito potrebbero non essere sufficientemente sicuri. Per questi casi d’uso, i programmatori Haskell spesso si rivolgono a librerie più specializzate come crypto-random, che sono progettate per soddisfare i rigidi requisiti delle applicazioni crittografiche.

Inoltre, librerie alternative come mwc-random offrono prestazioni migliori e qualità dei numeri casuali per simulazioni e altre applicazioni, implementando algoritmi moderni come il Mersenne Twister.

Quando si sceglie un approccio alla generazione di numeri casuali in Haskell, è fondamentale considerare le esigenze dell’applicazione riguardo alla qualità della casualità, alle prestazioni e alla sicurezza per selezionare lo strumento o la libreria più appropriati.