Geração de números aleatórios

Haskell:
Geração de números aleatórios

Como fazer:

Para gerar números aleatórios em Haskell, normalmente se utiliza o pacote random, que faz parte da Plataforma Haskell. Aqui está um guia passo a passo:

Primeiro, certifique-se de que você tenha o pacote random instalado. Se não, você pode obtê-lo via Cabal ou Stack.

Gerando um Número Aleatório

Para gerar um número aleatório simples, você pode usar a função randomRIO, que produz um valor aleatório dentro de um intervalo especificado.

import System.Random (randomRIO)

main :: IO ()
main = do
  randomNumber <- randomRIO (1, 10) :: IO Int
  putStrLn $ "Número aleatório: " ++ show randomNumber

Gerando uma Lista de Números Aleatórios

Gerar uma lista de números aleatórios é um pouco mais complicado, mas ainda assim direto:

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
 numbers <- randomList 5
 print numbers

Este trecho de código cria uma função randomList que gera uma lista de inteiros aleatórios. Substitua (1, 100) pelo intervalo desejado.

Aprofundamento

O pacote random de Haskell fornece um gerador de números pseudo-aleatórios (PRNG), o que significa que os números gerados não são verdadeiramente aleatórios, mas podem parecer ser aleatórios para muitas aplicações. O cerne da capacidade de geração de números aleatórios de Haskell reside na classe de tipo RandomGen, que abstrai diferentes métodos de geração de números aleatórios, e na classe de tipo Random, que inclui tipos que podem ser gerados aleatoriamente.

Historicamente, a abordagem de Haskell para a geração de números aleatórios enfatizou a pureza e a reprodutibilidade. É por isso que operações que envolvem aleatoriedade são explicitamente tratadas na monada IO ou exigem a passagem e atualização manual dos estados do gerador — para manter a transparência referencial.

Em certas aplicações, como criptografia, os números pseudo-aleatórios gerados pelo PRNG padrão podem não ser seguros o suficiente. Para esses casos de uso, programadores Haskell frequentemente recorrem a bibliotecas mais especializadas como crypto-random, que são projetadas para atender aos requisitos rigorosos de aplicações criptográficas.

Além disso, bibliotecas alternativas como mwc-random oferecem melhor desempenho e qualidade dos números aleatórios para simulações e outras aplicações, implementando algoritmos modernos como o Mersenne Twister.

Ao escolher uma abordagem de geração de números aleatórios em Haskell, é essencial considerar as necessidades da aplicação quanto à qualidade da aleatoriedade, desempenho e segurança para selecionar a ferramenta ou biblioteca mais apropriada.