Gerando números aleatórios

Go:
Gerando números aleatórios

Como fazer:

Em Go, números aleatórios são gerados usando o pacote math/rand para números pseudo-aleatórios ou crypto/rand para números pseudo-aleatórios criptograficamente seguros. Vamos explorar ambos.

Usando math/rand para Números Pseudo-Aleatórios

Primeiro, importe o pacote math/rand e o pacote time para semear o gerador. Semear garante que você obtenha uma sequência diferente de números a cada execução.

package main

import (
	"fmt"
	"math/rand"
	"time"
)

func main() {
	rand.Seed(time.Now().UnixNano())
	fmt.Println("Um número aleatório:", rand.Intn(100)) // Gera um número entre 0 e 99
}

Saída de exemplo: Um número aleatório: 42

Usando crypto/rand para Números Pseudo-Aleatórios Criptograficamente Seguros

Para aplicações mais sensíveis à segurança, o pacote crypto/rand é adequado, pois gera números aleatórios que são difíceis de prever, tornando-os adequados para operações criptográficas.

package main

import (
	"crypto/rand"
	"fmt"
	"math/big"
)

func main() {
	n, _ := rand.Int(rand.Reader, big.NewInt(100))
	fmt.Println("Um número aleatório seguro:", n)
}

Saída de exemplo: Um número aleatório seguro: 81

Aprofundando

A diferença principal entre os pacotes math/rand e crypto/rand em Go vem da sua fonte de entropia e dos casos de uso pretendidos. math/rand gera números pseudo-aleatórios baseados numa semente inicial; assim, a sequência é determinística e pode ser prevista se a semente for conhecida. Isso é adequado para cenários onde o desempenho alto e não a imprevisibilidade absoluta é a principal preocupação, como em simulações ou jogos.

Por outro lado, crypto/rand deriva aleatoriedade do sistema operacional subjacente, tornando-o adequado para usos criptográficos onde a imprevisibilidade é crucial. No entanto, isso vem com o custo de desempenho e complexidade no manuseio dos números que ele gera (como lidar com o tipo *big.Int para inteiros).

Historicamente, a noção de geração de números aleatórios em computadores sempre dançou na borda da verdadeira “aleatoriedade”, com sistemas antigos dependendo fortemente de algoritmos determinísticos que imitavam a aleatoriedade. Conforme os computadores evoluíram, esses algoritmos também evoluíram, incorporando fontes de entropia mais sofisticadas de seus ambientes.

Apesar desses avanços, a busca por uma aleatoriedade perfeita na computação é inerentemente paradoxal, dada a natureza determinística dos próprios computadores. É por isso que, para a maioria das aplicações onde a previsibilidade seria prejudicial, números pseudo-aleatórios criptograficamente seguros de fontes como crypto/rand são a alternativa melhor, apesar do seu overhead.

Em essência, a abordagem de Go com dois pacotes distintos para a geração de números aleatórios aborda elegantemente os compromissos entre desempenho e segurança, permitindo que os desenvolvedores escolham com base em suas necessidades específicas.