Menu

Números Aleatórios no R: rnorm, runif, sample e set.seed

Gere dados aleatórios com rnorm(), runif(), rbinom() e sample(), torne-os reprodutíveis com set.seed() e decodifique o sistema de nomes d/p/q/r do R para distribuições.

Esta página tem editores executáveis - edite, execute e veja a saída na hora.

set.seed() Vem Primeiro

Sorteios aleatórios que mudam a cada execução são inúteis para ensinar, avaliar, depurar ou fazer ciência - se sua simulação diz 0,146 hoje e 0,153 amanhã, qual número vai para o relatório? set.seed() fixa o ponto de partida do gerador, tornando todo o fluxo de "aleatoriedade" seguinte exatamente repetível:

Mesma semente, sorteios idênticos, toda vez, em qualquer máquina. Os números são pseudo-aleatórios: uma sequência determinística projetada para passar em todo teste estatístico de aleatoriedade, com a semente escolhendo em que ponto da sequência você começa. O valor da semente em si não carrega significado - 42, 7, 20260807 - escolha qualquer um; apenas anote-o. O hábito a construir: um set.seed() no topo de todo script que usa aleatoriedade. (Repare que consumir sorteios avança o estado, então a ordem das chamadas também importa para a reprodutibilidade.)

O Sistema d/p/q/r: Uma Tabela Decodifica a Biblioteca Inteira

O R nomeia toda função de distribuição como prefixo + família, e uma vez que você enxerga a grade consegue ler toda a biblioteca estatística:

PrefixoPergunta que respondeExemplo com a normal
rMe dê sorteios aleatóriosrnorm(5)
dDensidade: qual a altura da curva em x?dnorm(0)
pProbabilidade: P(X ≤ x)?pnorm(1.96)
qQuantil: qual x fica neste percentil?qnorm(0.975)

p e q são inversos, e são o par que você conheceu em intervalos de confiança como qt(0.975, df):

Troque o nome da família e tudo se transfere: runif/dunif/punif/qunif, rbinom/..., rpois/..., rt/..., rexp/.... Aprenda quatro prefixos, ganhe dezenas de distribuições.

rnorm(): Sorteios Normais

rnorm(n, mean, sd) sorteia de uma curva em sino - o burro de carga para simular dados de medição:

A média e o sd amostrais caem perto de - não exatamente em - 100 e 15: essa diferença é o ruído amostral, que encolhe conforme n cresce. A última linha é um truque que vale roubar: mean() de um vetor lógico é a proporção de TRUEs, e a fração acima de 130 sai perto do teórico 1 - pnorm(130, 100, 15) ≈ 2,3%. Os padrões são mean = 0, sd = 1 (a normal padrão). Um histograma de iq mostra o sino familiar.

runif(), rbinom(), rpois()

Mais três famílias cobrem a maioria das necessidades de simulação:

runif() espalha os sorteios uniformemente por uma faixa ("uniform", não "run if" - todo mundo lê errado uma vez). rbinom(n, size, prob) simula n experimentos de size tentativas cada, retornando a contagem de sucessos de cada um - então cada valor acima é o número de caras em 10 lançamentos. rpois(n, lambda) gera contagens de eventos que ocorrem independentemente a uma taxa média conhecida: chamados de suporte por hora, erros de digitação por página.

sample(): Amostragem e Embaralhamento

Onde as funções r* inventam valores a partir de uma distribuição, sample() sorteia a partir de valores que você já tem:

O argumento replace é toda a história: FALSE (padrão) distribui cartas - cada valor pode aparecer uma vez, e pedir mais do que você tem é um erro; TRUE joga dados - cada sorteio reinicia. Amostrar com reposição a partir dos seus próprios dados é o motor do bootstrap. Chamado apenas com um vetor, sample(x) retorna uma permutação aleatória - o idioma para embaralhar.

Amostrar linhas de um data frame usa sample() dentro da indexação de linhas:

sample(nrow(mtcars), 5) escolhe 5 números de linha aleatórios; a indexação puxa essas linhas. Esse é o movimento padrão para conferir por amostragem um conjunto de dados grande ou para separar conjuntos de treino/teste.

Uma Mini Simulação de Monte Carlo

Aqui está a recompensa de todo o kit. Pergunta: um processo produz medições distribuídas como N(100, 15); você tira a média de 10 delas - qual é a probabilidade de essa média passar de 105? Em vez de deduzir a resposta, simule - faça o experimento 10.000 vezes e conte:

A simulação cai a poucos milésimos do valor exato (cerca de 0,146). Isso é Monte Carlo em um fôlego: escreva um ensaio como uma função, aplique replicate() milhares de vezes e tire a mean() dos sucessos. A resposta exata existia aqui porque a montagem era simples como um livro-texto - no momento em que a pergunta fica bagunçada (distribuições estranhas, máximo de sorteios correlacionados, um jogo baseado em regras), o caminho analítico se fecha e a receita da simulação continua funcionando sem mudanças. Repare no 15 / sqrt(10) da checagem: médias oscilam menos que sorteios individuais - a mesma lei da raiz quadrada que determina as larguras dos intervalos de confiança.

Bom para Simulação, Não para Segredos

Uma fronteira a respeitar: o gerador padrão do R (Mersenne Twister) foi construído para qualidade estatística e velocidade, não para sigilo. Sua saída é determinística dada a semente, e seu estado interno pode ser reconstruído a partir da saída observada - falhas fatais para senhas, tokens ou qualquer coisa próxima de segurança. Para simulação, bootstrap e ensino ele é excelente; para criptografia, use uma biblioteca feita para isso (por exemplo, o pacote openssl), nunca sample() ou runif().

O Que Você Leva Daqui

  • set.seed() uma vez no topo torna todo resultado "aleatório" reprodutível - mesma semente, mesmos sorteios.
  • Os prefixos d/p/q/r decodificam a biblioteca inteira de distribuições: sorteio aleatório, densidade, probabilidade acumulada, quantil.
  • rnorm(n, mean, sd), runif(n, min, max), rbinom(n, size, prob), rpois(n, lambda) cobrem a maior parte das necessidades de simulação.
  • sample() sorteia a partir dos seus próprios valores - replace = TRUE para dados, padrão para cartas, sem size para embaralhar; df[sample(nrow(df), k), ] amostra linhas.
  • Monte Carlo = função de um ensaio + replicate() + mean() - a receita que responde perguntas de probabilidade que a matemática não alcança com conforto.
  • O gerador do R é para simulação, não para criptografia.

A seguir: depuração - o que as mensagens de erro do R realmente significam e como ler um traceback.

Perguntas frequentes

O que set.seed() faz no R?

Ele fixa o ponto de partida do gerador de números aleatórios do R, de modo que os sorteios "aleatórios" seguintes saiam idênticos em toda execução. Chame-o uma vez no topo de qualquer script que use aleatoriedade - set.seed(42) - e sua simulação vira reprodutível: colegas, avaliadores e o seu eu futuro veem todos os mesmos números.

Como gerar números aleatórios no R?

Escolha a distribuição: rnorm(n, mean, sd) para sorteios normais, runif(n, min, max) para uniformes, rbinom(n, size, prob) para contagens de sucessos, rpois(n, lambda) para contagens de eventos. Para amostrar a partir de valores existentes, use sample(x, size).

Qual é a diferença entre rnorm, dnorm, pnorm e qnorm?

Uma distribuição, quatro prefixos: r sorteia valores aleatórios, d dá a altura da curva de densidade, p dá a probabilidade acumulada P(X ≤ x), e q é o inverso dela - o valor em um dado percentil. Os mesmos quatro prefixos funcionam para toda distribuição que o R conhece: runif/dunif/punif/qunif, rbinom/dbinom/pbinom/qbinom, e assim por diante.

Como pegar uma amostra aleatória de linhas de um data frame no R?

Indexe as linhas com sample(): df[sample(nrow(df), 5), ] escolhe 5 linhas sem reposição. Acrescente replace = TRUE para amostragem com reposição (o movimento por trás do bootstrap).

Coddy programming languages illustration

Aprenda a programar com o Coddy

COMEÇAR