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
- 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.
- Não use random para criptografia — prefira o módulo
secretspara tokens, senhas e qualquer dado que precise ser imprevisível para um atacante. - 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.
- Prefira numpy.random para grandes volumes de dados, especialmente em ciência de dados e machine learning.
- 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. - 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 bchoice(seq)— um item aleatóriosample(pop, k)— amostra sem reposiçãoshuffle(lista)— embaralha in-placeseed(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.