Skip to content

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., 35

Floats 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çãoReposiçãoRetornaCaso de uso
choice(seq)N/A (item único)Um elementoEscolher um item aleatório
choices(pop, k=n)Com reposiçãoLista de n elementosAleatório ponderado, simulações
sample(pop, k=n)Sem reposiçãoLista de n elementos únicosLoteria, 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... again

Quando usar seeds

CenárioSeed?Por quê
Testes unitáriosSimResultados reprodutíveis
DepuraçãoSimReproduzir o bug exato
Simulações (análise)SimExperimentos reprodutíveis
Jogos (gameplay)NãoJogadores esperam aleatoriedade real
Segurança/criptoNã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ísticarandomsecrets
AlgoritmoMersenne Twister (PRNG)Fonte de entropia do SO (CSPRNG)
DeterminísticoSim (com seed)Não
VelocidadeRápidoMais lento
Usar paraSimulações, jogos, testesSenhas, tokens, cripto
ReprodutívelSim (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.

📚