NumPy: Números Aleatórios
Última atualização: 2026-08-26
1. O que Você Aprenderá
- ❶ A API moderna
default_rngGenerator - ❷ Distribuições comuns: uniforme, normal, inteira, choice
- ❸ Sementeamento para reprodutibilidade
- ❹ Amostragem aleatória: com e sem reposição
- ❺ API antiga vs nova
2. História
Alice executa uma simulação de Monte Carlo para um modelo financeiro. Ela obtém resultados diferentes toda vez — impossível depurar. Bob mostra a ela: "Use default_rng(42) — a mesma semente sempre produz a mesma sequência. Depure com semente, implante sem." Alice fixa sua semente e encontra o bug em 5 minutos.
3. A API Moderna Generator
(1) Criando um Generator
import numpy as np
# Forma moderna (recomendada)
rng = np.random.default_rng(42) # semente = 42 para reprodutibilidade
# Forma antiga (legado)
np.random.seed(42)
(2) Distribuições Comuns
rng = np.random.default_rng(42)
print(rng.random(3)) # 3 uniformes [0, 1)
print(rng.normal(0, 1, 3)) # 3 normais padrão
print(rng.integers(0, 10, 5)) # 5 inteiros [0, 10)
print(rng.uniform(0, 10, 3)) # 3 uniformes [0, 10)
> **Output:** Execute o NumPy 2.x em seu ambiente Python local para ver a saída do ndarray. O servidor Piston não tem o NumPy pré-instalado — instale-o localmente (`pip install numpy`) e compare. Os valores reais podem variar conforme a versão do NumPy e a semente aleatória.
(3) Amostragem Aleatória
rng = np.random.default_rng(42)
data = np.arange(10)
# Com reposição
sample = rng.choice(data, size=5, replace=True)
# Sem reposição
sample2 = rng.choice(data, size=5, replace=False)
# Embaralhar
rng.shuffle(data) # embaralhamento in-place
> **Output:** Execute o NumPy 2.x em seu ambiente Python local para ver a saída do ndarray. O servidor Piston não tem o NumPy pré-instalado — instale-o localmente (`pip install numpy`) e compare. Os valores reais podem variar conforme a versão do NumPy e a semente aleatória.
▶ Exemplo: Gerando distribuições aleatórias (Dificuldade ⭐)
import numpy as np
rng = np.random.default_rng(42)
uniform = rng.random(5)
normal = rng.normal(0, 1, 5)
integers = rng.integers(1, 100, 5)
print("Uniforme [0,1):", uniform)
print("Normal N(0,1):", normal)
print("Inteiros 1-99:", integers)
Output:
TEXT 📖 Somente leituraUniforme [0,1): [0.77395605 0.43887844 0.85859792 0.69736803 0.09417735] Normal N(0,1): [-0.45938412 -0.19865146 0.1113586 -1.00408446 2.02558468] Inteiros 1-99: [79 64 66 81 96]
▶ Exemplo: Amostragem aleatória com e sem reposição (Dificuldade ⭐⭐)
import numpy as np
rng = np.random.default_rng(42)
data = np.arange(20)
# Com reposição — o mesmo elemento pode aparecer múltiplas vezes
with_repl = rng.choice(data, size=10, replace=True)
print("Com reposição:", with_repl)
# Sem reposição — todos os elementos são únicos
without_repl = rng.choice(data, size=10, replace=False)
print("Sem reposição:", without_repl)
# Embaralhar in-place
rng.shuffle(data)
print("Dados embaralhados:", data)
Output:
TEXT 📖 Somente leituraCom reposição: [ 6 19 9 12 6 15 0 7 3 14] Sem reposição: [13 10 8 11 5 1 9 16 18 4] Dados embaralhados: [ 8 7 13 10 18 3 15 5 14 16 0 9 2 1 11 17 12 19 6 4]
▶ Exemplo: Sequências reprodutíveis com sementes (Dificuldade ⭐)
import numpy as np
# Mesma semente = mesma sequência
rng1 = np.random.default_rng(123)
rng2 = np.random.default_rng(123)
print("rng1:", rng1.random(4))
print("rng2:", rng2.random(4))
# Semente diferente = sequência diferente
rng3 = np.random.default_rng(456)
print("rng3:", rng3.random(4))
Output:
TEXT 📖 Somente leiturarng1: [0.18701985 0.68208779 0.60135938 0.51034031] rng2: [0.18701985 0.68208779 0.60135938 0.51034031] rng3: [0.59831648 0.72572267 0.04819845 0.35980509]
P: Por que usar
default_rngem vez denp.random.seed? R:default_rngcria um objeto Generator independente — você pode ter múltiplos fluxos independentes.np.random.seeddefine uma semente global que afeta todo o código, o que é frágil e pode causar interferência entre módulos.
P: Como obtenho resultados reprodutíveis? R: Passe uma semente fixa:
rng = np.random.default_rng(42). A mesma semente sempre produz a mesma sequência. Use sementes diferentes para execuções diferentes.
P: Qual é a diferença entre
randomeuniform? R:rng.random(size)retorna valores em [0, 1).rng.uniform(low, high, size)retorna valores em [low, high).randomé um caso especial deuniform(0, 1).
❓ Perguntas Frequentes
P: O que é a coisa mais importante a lembrar? R: As operações do NumPy são vetorizadas — evite loops Python para melhor desempenho.
P: Onde posso aprender mais? R: Consulte a documentação oficial do NumPy em numpy.org para referências detalhadas e tópicos avançados.
P: Isso funciona com o NumPy 2.x? R: Sim — todos os exemplos são compatíveis com o NumPy 2.x. Algumas APIs mais antigas (como np.random.seed) ainda são suportadas, mas as alternativas modernas são recomendadas.
📖 Resumo
- Use
np.random.default_rng(seed)para a API moderna Generator - Distribuições comuns:
random,normal,integers,uniform,choice - Sementeie seu RNG para resultados reprodutíveis
shufflemodifica in-place;choiceamostra com/sem reposição- A antiga
np.random.seed()ainda funciona mas é legado — prefiradefault_rng
📝 Exercícios
-
Básico (Dificuldade ⭐): Use
default_rng(42)para gerar 10 floats aleatórios, 10 inteiros aleatórios (0-100) e 10 números de uma distribuição normal. Imprima-os. -
Intermediário (Dificuldade ⭐⭐): Gere 1000 números aleatórios de uma distribuição normal. Compute a média e o desvio padrão. Verifique se são aproximadamente 0 e 1.
-
Desafio (Dificuldade ⭐⭐⭐): Use
rng.choicecom e sem reposição para amostrar 10 itens de um dataset de 100. Explique a diferença e quando usaria cada um.