Python Random: Gere números aleatórios, escolhas e amostras
Updated on
Gerar dados aleatórios é fundamental na programação -- desde embaralhar uma playlist e amostrar respondentes de pesquisa até executar simulações de Monte Carlo e criar conjuntos de dados de teste. Mas o módulo random do Python tem dezenas de funções, e é fácil usar a errada. Chamar random.random() quando você precisa de um inteiro, usar choice() quando precisa de múltiplos itens únicos, ou esquecer que random não é criptograficamente seguro pode levar a bugs sutis ou vulnerabilidades de segurança.
O módulo random do Python fornece um kit de ferramentas completo para geração de números pseudoaleatórios. Este guia cobre cada função que você comumente precisará, com exemplos claros mostrando quando usar cada uma.
Inteiros aleatórios
randint(a, b)
Retorna um inteiro aleatório N tal que a <= N <= b (ambos os extremos incluídos).
import random
# Random integer between 1 and 10 (inclusive)
print(random.randint(1, 10)) # e.g., 7
# Simulate a dice roll
dice = random.randint(1, 6)
print(f"You rolled a {dice}")
# Generate random ages for test data
ages = [random.randint(18, 65) for _ in range(5)]
print(ages) # e.g., [34, 52, 21, 45, 28]randrange(start, stop, step)
Como range() mas retorna um elemento aleatório. O valor stop é excluído.
import random
# Random even number between 0 and 100
print(random.randrange(0, 101, 2)) # e.g., 42
# Random number from 0 to 9
print(random.randrange(10)) # e.g., 7
# Random multiple of 5 from 0 to 100
print(random.randrange(0, 101, 5)) # e.g., 35Floats aleatórios
random()
Retorna um float aleatório no intervalo [0.0, 1.0).
import random
print(random.random()) # e.g., 0.7234...
# Scale to any range: random float between 10 and 20
value = 10 + random.random() * 10
print(value) # e.g., 15.23...uniform(a, b)
Retorna um float aleatório N tal que a <= N <= b.
import random
# Random temperature between 98.0 and 99.5
temp = random.uniform(98.0, 99.5)
print(f"Temperature: {temp:.1f}F") # e.g., Temperature: 98.7F
# Random price between 9.99 and 29.99
price = round(random.uniform(9.99, 29.99), 2)
print(f"Price: ${price}")gauss(mu, sigma) -- Distribuição normal
import random
# Generate normally distributed values (mean=100, std=15)
iq_scores = [round(random.gauss(100, 15)) for _ in range(10)]
print(iq_scores) # e.g., [112, 95, 103, 88, 107, ...]Seleções aleatórias
choice(seq)
Retorna um único elemento aleatório de uma sequência não vazia.
import random
colors = ['red', 'blue', 'green', 'yellow', 'purple']
print(random.choice(colors)) # e.g., 'green'
# Random character from a string
print(random.choice('abcdefghij')) # e.g., 'f'choices(population, weights, k)
Retorna uma lista de k elementos escolhidos COM reposição (duplicatas possíveis). Suporta pesos.
import random
# Pick 5 random colors (duplicates allowed)
colors = ['red', 'blue', 'green']
print(random.choices(colors, k=5)) # e.g., ['blue', 'red', 'blue', 'green', 'red']
# Weighted selection (red is 5x more likely)
weighted = random.choices(
['red', 'blue', 'green'],
weights=[5, 1, 1],
k=10
)
print(weighted) # Mostly 'red'sample(population, k)
Retorna k elementos únicos escolhidos SEM reposição (sem duplicatas).
import random
# Lottery numbers: 6 unique numbers from 1-49
lottery = random.sample(range(1, 50), 6)
print(sorted(lottery)) # e.g., [3, 12, 27, 33, 41, 48]
# Random survey sample
employees = ['Alice', 'Bob', 'Charlie', 'Diana', 'Eve', 'Frank']
survey_group = random.sample(employees, 3)
print(survey_group) # e.g., ['Diana', 'Alice', 'Frank']choice vs choices vs sample
| Função | Reposição | Retorna | Caso de uso |
|---|---|---|---|
choice(seq) | N/A (item único) | Um elemento | Escolher um item aleatório |
choices(pop, k=n) | Com reposição | Lista de n elementos | Aleatório ponderado, simulações |
sample(pop, k=n) | Sem reposição | Lista de n elementos únicos | Loteria, subconjuntos aleatórios |
Embaralhamento
shuffle(seq)
Embaralha uma lista no local. Retorna None.
import random
deck = list(range(1, 53)) # 52 cards
random.shuffle(deck)
print(deck[:5]) # e.g., [37, 12, 48, 3, 21]
# Deal 5 cards
hand = deck[:5]
remaining = deck[5:]Seeds e reprodutibilidade
Definir um seed torna a saída aleatória reprodutível -- essencial para testes e depuração.
import random
random.seed(42)
print(random.randint(1, 100)) # Always 81
print(random.random()) # Always 0.0744...
# Reset seed for same sequence
random.seed(42)
print(random.randint(1, 100)) # 81 again
print(random.random()) # 0.0744... againQuando usar seeds
| Cenário | Seed? | Por quê |
|---|---|---|
| Testes unitários | Sim | Resultados reprodutíveis |
| Depuração | Sim | Reproduzir o bug exato |
| Simulações (análise) | Sim | Experimentos reprodutíveis |
| Jogos (gameplay) | Não | Jogadores esperam aleatoriedade real |
| Segurança/cripto | Não (use secrets) | Seeds tornam a saída previsível |
Gerar dados de teste
import random
import string
def random_string(length=10):
"""Generate a random alphanumeric string."""
chars = string.ascii_letters + string.digits
return ''.join(random.choices(chars, k=length))
def random_email():
"""Generate a random email address."""
name = random_string(8).lower()
domains = ['gmail.com', 'yahoo.com', 'outlook.com']
return f"{name}@{random.choice(domains)}"
def random_user():
"""Generate a random user record."""
first_names = ['Alice', 'Bob', 'Charlie', 'Diana', 'Eve']
last_names = ['Smith', 'Jones', 'Brown', 'Wilson', 'Taylor']
return {
'name': f"{random.choice(first_names)} {random.choice(last_names)}",
'email': random_email(),
'age': random.randint(18, 65),
'score': round(random.uniform(0, 100), 1),
}
# Generate 5 test users
users = [random_user() for _ in range(5)]
for user in users:
print(user)Random e ciência de dados
Para fluxos de trabalho de análise de dados, o módulo random ajuda com amostragem, bootstrapping e criação de conjuntos de dados sintéticos. Combinado com pandas, você pode gerar DataFrames de teste rapidamente:
import random
import pandas as pd
random.seed(42)
n = 1000
df = pd.DataFrame({
'age': [random.randint(18, 80) for _ in range(n)],
'income': [round(random.gauss(50000, 15000), 2) for _ in range(n)],
'category': random.choices(['A', 'B', 'C'], weights=[5, 3, 2], k=n),
})
print(df.describe())Para exploração interativa de seus conjuntos de dados aleatórios, PyGWalker (opens in a new tab) transforma qualquer DataFrame pandas em uma interface de visualização estilo Tableau dentro do Jupyter:
import pygwalker as pyg
walker = pyg.walk(df)Aviso de segurança: random vs secrets
O módulo random NÃO é adequado para fins de segurança. Sua saída é determinística e previsível se o seed for conhecido. Para senhas, tokens e aplicações criptográficas, use o módulo secrets:
import secrets
# Cryptographically secure random token
token = secrets.token_hex(16)
print(token) # e.g., 'a3f2b8c9d1e4f5a6b7c8d9e0f1a2b3c4'
# Secure random integer
secure_int = secrets.randbelow(100)
# Secure random choice
secure_choice = secrets.choice(['option1', 'option2', 'option3'])| Característica | random | secrets |
|---|---|---|
| Algoritmo | Mersenne Twister (PRNG) | Fonte de entropia do SO (CSPRNG) |
| Determinístico | Sim (com seed) | Não |
| Velocidade | Rápido | Mais lento |
| Usar para | Simulações, jogos, testes | Senhas, tokens, cripto |
| Reprodutível | Sim (com seed()) | Não |
FAQ
Como gero um inteiro aleatório em Python?
Use random.randint(a, b) para obter um inteiro aleatório entre a e b (inclusive). Por exemplo, random.randint(1, 10) retorna um número de 1 a 10. Para um intervalo que exclui o limite superior, use random.randrange(start, stop).
Qual é a diferença entre random.choice e random.sample?
random.choice(seq) retorna um único elemento aleatório. random.sample(population, k) retorna k elementos únicos sem reposição. Para selecionar múltiplos itens onde duplicatas são permitidas, use random.choices(population, k=n).
Como torno resultados aleatórios reprodutíveis?
Chame random.seed(value) antes de gerar números aleatórios. Usar o mesmo seed produz a mesma sequência de valores aleatórios toda vez. Isso é essencial para testes unitários e depuração.
O módulo random do Python é seguro?
Não. O módulo random usa o algoritmo Mersenne Twister, que é determinístico e previsível. Para aplicações sensíveis à segurança como senhas ou tokens, use o módulo secrets em vez disso, que usa fontes aleatórias criptograficamente seguras.
Como embaralho uma lista aleatoriamente em Python?
Use random.shuffle(my_list) para embaralhar uma lista no local. Ele modifica a lista original e retorna None. Se precisar da lista original inalterada, faça uma cópia primeiro: shuffled = my_list.copy(); random.shuffle(shuffled).
Conclusão
O módulo random do Python cobre toda necessidade comum de aleatorização: randint para inteiros, uniform para floats, choice/choices/sample para selecionar de sequências, shuffle para reordenar e seed para reprodutibilidade. Lembre-se da distinção chave: choices permite duplicatas (com reposição), sample não (sem reposição). E nunca use random para segurança -- use secrets em vez disso.