O módulo random é uma das bibliotecas padrão mais versáteis do Python. Se você precisa gerar números aleatórios, selecionar itens de uma lista, embaralhar dados ou criar simulações, o random é a ferramenta certa. Neste guia completo, você aprenderá desde o básico até técnicas avançadas com exemplos práticos.

Gerar dados aleatórios é essencial em diversas áreas: desenvolvimento de jogos, testes de software, simulações científicas, amostragem estatística, machine learning e muito mais. O Python torna esse trabalho simples e intuitivo com seu módulo random nativo.

Se você está começando agora, confira nosso guia completo para iniciantes em Python antes de mergulhar neste artigo.

Por que Usar o Módulo Random?

O módulo random implementa geradores de números pseudoaleatórios para várias distribuições. Isso significa que, embora os números pareçam aleatórios, eles são gerados por um algoritmo determinístico. Para aplicações que exigem aleatoriedade criptográfica, o Python oferece o módulo secrets.

As principais aplicações incluem:

  • Jogos: gerar posições, atributos, lootboxes e comportamentos imprevisíveis
  • Testes: criar dados de teste variados e representativos
  • Simulações: modelar fenômenos aleatórios como filas, tráfego e finanças
  • Amostragem: selecionar subconjuntos representativos de populações
  • Machine Learning: embaralhar dados, inicializar pesos e criar splits treino/teste

Outra função útil é random.getrandbits(k), que retorna um inteiro com k bits aleatórios. Essa função é eficiente para gerar números grandes sem precisar especificar intervalos manualmente.

import random

Número de 8 bits (0 a 255)

print(random.getrandbits(8)) # Exemplo: 187

Número de 16 bits (0 a 65535)

print(random.getrandbits(16)) # Exemplo: 42351

Com o random, você pode simular cenários complexos em poucas linhas de código. Vamos ver os principais recursos na prática.

Principais Funções do Módulo Random

O módulo oferece dezenas de funções. A documentação oficial do Python é a referência completa, mas vamos cobrir as funções mais usadas no dia a dia. Todas compartilham o mesmo gerador subjacente, permitindo misturar chamadas de diferentes funções sem problemas.

random.random() — Número Float Aleatório

A função mais básica: retorna um número float aleatório no intervalo [0.0, 1.0).

import random

print(random.random()) # Exemplo: 0.3746325874916233 print(random.random()) # Exemplo: 0.8921567432810459

Útil para gerar probabilidades, porcentagens ou normalizar dados.

random.randint() — Inteiro Aleatório

Retorna um número inteiro aleatório entre A e B (inclusive).

import random

dado = random.randint(1, 6) print(f'Você tirou {dado} no dado')

sorteio = random.randint(1, 60) print(f'Número da mega-sena: {sorteio}')

Essa é provavelmente a função mais popular do módulo. Use randint sempre que precisar de um valor inteiro dentro de um intervalo.

random.randrange() — Inteiro com Passo

Similar ao randint, mas aceita um parâmetro step opcional, igual à função range():

import random

Número par aleatório entre 0 e 20

par = random.randrange(0, 21, 2) print(f'Número par: {par}')

Múltiplo de 5 entre 0 e 50

mult5 = random.randrange(0, 51, 5) print(f'Múltiplo de 5: {mult5}')

Essa função é útil quando você precisa de números que seguem um padrão específico, como gerar índices pares ou valores em progressão aritmética.

random.uniform() — Float em Intervalo Personalizado

Similar ao random(), mas permite definir os limites:

import random

temperatura = random.uniform(36.0, 40.0) print(f'Temperatura simulada: {temperatura:.1f}°C')

preco = random.uniform(10.50, 99.90) print(f'Preço aleatório: R$ {preco:.2f}')

random.choice() — Selecionar um Item Aleatório

Escolhe um elemento aleatório de uma sequência (lista, tupla, string):

import random

frutas = ['maçã', 'banana', 'laranja', 'uva', 'morango'] print(random.choice(frutas)) # Exemplo: 'laranja'

Com strings

letra = random.choice('ABCDEFGH') print(letra) # Exemplo: 'C'

O random.choice() é amplamente usado em sorteios, jogos e testes A/B.

Para entender melhor como listas funcionam em Python, veja nosso guia completo de manipulação de listas.

random.choices() — Múltiplos Itens com Reposição

Seleciona K itens de uma população, permitindo repetições. Aceita pesos para definir probabilidades:

import random

cores = ['vermelho', 'azul', 'verde'] pesos = [0.5, 0.3, 0.2] # 50% vermelho, 30% azul, 20% verde

resultado = random.choices(cores, weights=pesos, k=10) print(resultado)

Exemplo: ['vermelho', 'azul', 'vermelho', 'verde', 'azul', ...]

Essa função é fantástica para simular distribuições de probabilidade personalizadas.

random.sample() — Amostra sem Reposição

Seleciona K itens únicos de uma população, sem repetir:

import random

alunos = ['Ana', 'Bruno', 'Carla', 'Daniel', 'Eduarda', 'Felipe'] sorteados = random.sample(alunos, 3) print(f'Sorteados: {sorteados}')

Números da mega-sena

megasena = random.sample(range(1, 61), 6) print(f'Mega-Sena: {sorted(megasena)}')

Use sample quando cada item pode ser selecionado apenas uma vez, como em sorteios, splits de dados para machine learning e validação cruzada.

random.shuffle() — Embaralhar uma Lista

Embaralha os elementos de uma lista in-place (modifica a lista original):

import random

cartas = ['A♠', 'K♠', 'Q♠', 'J♠', '10♠', '9♠', '8♠'] random.shuffle(cartas) print(cartas) # Exemplo: ['Q♠', 'A♠', '10♠', 'K♠', '9♠', 'J♠', '8♠']

Para dados de treino

dados = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] random.shuffle(dados) treino, teste = dados[:7], dados[7:] print(f'Treino: {treino}') print(f'Teste: {teste}')

Embaralhar dados é uma etapa crítica no pré-processamento de machine learning para evitar viés de ordem.

Trabalhando com Seeds (Sementes)

Números pseudoaleatórios são gerados a partir de uma semente (seed). Se você define a mesma seed, obtém exatamente a mesma sequência de números. Isso é essencial para reprodutibilidade em experimentos científicos e machine learning.

import random

random.seed(42) print(random.randint(1, 100)) # Sempre 82 print(random.random()) # Sempre 0.639426798...

random.seed(42) # Resetando a seed print(random.randint(1, 100)) # Novamente 82

Segundo a Real Python, usar seeds é uma das melhores práticas em ciência de dados, pois garante que seus experimentos possam ser reproduzidos por outros pesquisadores.

Dica Profissional: Usar Seed do Sistema

Por padrão, o Python usa os.urandom() como seed inicial, que é baseado em fontes verdadeiramente aleatórias do sistema operacional. Você pode capturar o estado atual do gerador com random.getstate() e restaurá-lo depois. Isso é especialmente útil em depuração: você pode salvar o estado antes de uma sequência de operações, testar várias vezes e sempre voltar ao mesmo ponto de partida.

import random

estado = random.getstate()

Gere quantos números quiser...

random.setstate(estado) # Volta ao estado anterior

Distribuições Estatísticas

O módulo random oferece funções para diversas distribuições estatísticas, fundamentais para simulações científicas:

Distribuição Uniforme

import random

Valores uniformemente distribuídos entre 0 e 10

for _ in range(5): print(random.uniform(0, 10))

Distribuição Normal (Gaussiana)

import random

Média 0, desvio padrão 1

for _ in range(5): print(random.gauss(0, 1))

Altura simulada de uma população

altura = random.gauss(170, 10) # Média 170cm, DP 10cm print(f'Altura simulada: {altura:.1f} cm')

Distribuição Triangular

A distribuição triangular é útil quando você conhece o valor mínimo, o máximo e o valor mais provável (moda) de um fenômeno:

import random

Simular tempo de conclusão de uma tarefa (otimista: 2h, provável: 4h, pessimista: 8h)

tempo_estimado = random.triangular(2, 8, 4) print(f'Tempo estimado: {tempo_estimado:.1f} horas')

Popular em simulações de gerenciamento de projetos (PERT)

duracao = random.triangular(10, 30, 15) print(f'Duração simulada: {duracao:.1f} dias')

Essa distribuição é amplamente usada em simulações de engenharia e gerenciamento de projetos quando os dados históricos são limitados.

Distribuição Exponencial

import random

Simular tempo entre chegadas em uma fila

lambda_param = 2.0 # 2 chegadas por minuto tempo = random.expovariate(lambda_param) print(f'Tempo até próxima chegada: {tempo:.2f} minutos')

Para um tratamento mais robusto de distribuições, a biblioteca NumPy oferece funções otimizadas. Veja o módulo numpy.random para aplicações científicas de alto desempenho. Se quiser se aprofundar em NumPy, confira nosso guia completo de NumPy.

Casos de Uso Reais

1. Simulador de Dados

import random

def jogar_dado(lados=6): return random.randint(1, lados)

Simular 1000 lançamentos

resultados = [jogardado() for in range(1000)] frequencias = {i: resultados.count(i) for i in range(1, 7)} print(frequencias)

2. Gerador de Senhas Aleatórias

import random
import string

def gerar_senha(tamanho=12): caracteres = string.asciiletters + string.digits + '!@#$%&*' return ''.join(random.choice(caracteres) for in range(tamanho))

print(gerar_senha()) # Exemplo: 'aK7$mP9@xL2#'

Para senhas seguras, prefira o módulo secrets, que usa fontes criptograficamente seguras.

3. Simulação de Monte Carlo

Uma das aplicações mais poderosas: estimar o valor de Pi usando o método de Monte Carlo:

import random

def estimarpi(pontos=100000): dentro = 0 for in range(pontos): x, y = random.random(), random.random() if xx + yy <= 1: dentro += 1 return 4 * dentro / pontos

print(f'Pi estimado: {estimar_pi()}') # ~3.1415

4. Split Treino-Teste para Machine Learning

import random

dados = list(range(100)) random.shuffle(dados)

split = int(0.8 * len(dados)) treino = dados[:split] teste = dados[split:]

print(f'Treino: {len(treino)} amostras') print(f'Teste: {len(teste)} amostras')

Random vs NumPy Random vs Secrets

O Python oferece três abordagens principais para aleatoriedade:

Módulo Quando Usar Performance
random Uso geral, jogos, scripts simples Boa
numpy.random Grandes volumes de dados, arrays multidimensionais Excelente (vetorizado)
secrets Senhas, tokens, criptografia Moderada

O NumPy random é significativamente mais rápido para grandes conjuntos de dados, pois gera arrays inteiros de uma vez usando código C otimizado. O módulo secrets é obrigatório quando a segurança é prioridade.

Boas Práticas

  1. Sempre use seed para reprodutibilidade em experimentos e testes científicos. Defina a seed no início do script e documente qual valor foi usado.
  2. Não use random para criptografia — prefira o módulo secrets para tokens, senhas e qualquer dado que precise ser imprevisível para um atacante.
  3. Documente suas seeds para que outros pesquisadores possam replicar seus resultados. Uma boa prática é usar o timestamp como seed padrão, mas permitir sua configuração externa.
  4. Prefira numpy.random para grandes volumes de dados, especialmente em ciência de dados e machine learning.
  5. Cuidado com shuffle em listas grandes — ele modifica a lista in-place. Se precisar preservar a original, faça uma cópia com copia = lista.copy() antes de embaralhar.
  6. Teste seus geradores: sempre verifique se os valores gerados estão dentro dos intervalos esperados, especialmente em aplicações críticas como simulações financeiras ou médicas.

Performance e Limitações

O random usa o algoritmo Mersenne Twister (MT19937), que é rápido e passa na maioria dos testes estatísticos de aleatoriedade. No entanto, ele não é adequado para:

  • Criptografia (use secrets)
  • Simulações que exigem enorme quantidade de números aleatórios (prefira NumPy)
  • Aplicações sensíveis a padrões de longo período

O período do Mersenne Twister é 2^19937 − 1, o que é mais que suficiente para praticamente qualquer aplicação não criptográfica. Em termos práticos, isso significa que você pode gerar trilhões de números antes que o ciclo se repita. Para aplicações que exigem ainda mais desempenho, o NumPy implementa o mesmo algoritmo em C com vetorização, sendo até 50x mais rápido para grandes volumes.

Para aprender mais sobre o algoritmo, o GeeksforGeeks tem um excelente artigo técnico.

Conclusão

O módulo random do Python é uma ferramenta poderosa e versátil que todo desenvolvedor deveria dominar. Desde simples lançamentos de dado até simulações complexas de Monte Carlo, ele oferece as funcionalidades essenciais para trabalhar com aleatoriedade de forma produtiva e confiável.

Resumo das funções mais importantes:

  • random() — float em [0, 1)
  • randint(a, b) — inteiro entre a e b
  • choice(seq) — um item aleatório
  • sample(pop, k) — amostra sem reposição
  • shuffle(lista) — embaralha in-place
  • seed(n) — define semente para reprodutibilidade

Lembre-se de consultar a documentação oficial para explorar todas as funções disponíveis. Pratique com os exemplos deste artigo e em breve você estará usando o módulo random com confiança em seus projetos.

Para continuar seus estudos, veja também o tutorial interativo da PYnative e os exemplos do W3Schools sobre random.