Arma Secreta JS: Geração de Números Aleatórios com Máxima Performance

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Acaso não é sorte? Como fazer o JavaScript gerar números "justos"

\n\n

Imagine: você está criando um jogo onde o inimigo aparece em um ponto aleatório da tela. Ou desenvolvendo um teste A/B que distribui usuários uniformemente entre grupos. Ou simplesmente quer gerar uma senha aleatória. Em todos os casos, você precisará da mesma mágica — a geração de um número aleatório entre dois valores em JavaScript.

\n\n

Parece simples, não? Math.random() e pronto. Mas, como mostra a pergunta popular no Stack Overflow (milhões de visualizações, milhares de votos), o diabo está nos detalhes. Uma implementação incorreta pode causar viés (bias) na distribuição, lentidão na performance e bugs inesperados.

\n\n

Neste artigo, não vamos apenas dar o código pronto. Vamos dissecar sua anatomia, aprender a otimizar para diferentes cenários e entender como tornar a geração o mais performática possível. Vamos nessa!

\n\n

Fundamentos: Math.random() e por que ele sozinho não basta

\n\n

No coração de qualquer geração de números aleatórios em JS está o método Math.random(). Ele retorna um número pseudoaleatório de ponto flutuante no intervalo [0, 1) (incluindo 0, mas nunca incluindo 1).

\n\n
console.log(Math.random()); // 0.234567890123456\nconsole.log(Math.random()); // 0.987654321098765
\n\n

É uma base excelente, mas inútil se você precisa de um número entre 5 e 10 ou entre -100 e 100. Precisamos de uma função para gerar um número aleatório em um intervalo específico.

\n\n

A resposta canônica do Stack Overflow

\n\n

A solução mais popular e correta é esta:

\n\n
function getRandomArbitrary(min, max) {\n  return Math.random() * (max - min) + min;\n}
\n\n
    \n
  • Como funciona: (max - min) é a largura do intervalo. Multiplicando por Math.random(), obtemos um número de 0 até a largura. Somando min, deslocamos o resultado para o intervalo desejado.
  • \n
  • Resultado: Um número decimal de min (inclusivo) até max (exclusivo).
  • \n
\n\n

Mas e se você precisar de um número inteiro? É aí que entram Math.floor(), Math.ceil() e Math.round().

\n\n

Gerando um número inteiro aleatório: O diabo está no arredondamento

\n\n

A segunda parte da resposta no Stack Overflow é a função para números inteiros:

\n\n
function getRandomInt(min, max) {\n  min = Math.ceil(min);\n  max = Math.floor(max);\n  return Math.floor(Math.random() * (max - min + 1)) + min;\n}
\n\n

Observe o + 1 no final. Este é um detalhe crucial. Sem ele, o valor máximo max nunca será sorteado, porque Math.random() nunca retorna exatamente 1.

\n\n

Por que Math.ceil() e Math.floor()?

\n

Isso é uma proteção contra entradas inválidas. Se alguém passar min = 1.5, Math.ceil(1.5) o transforma em 2. E Math.floor(9.9) vira 9. Isso garante uma entrada inteira e um resultado previsível.

\n\n

Otimização de performance: Comparando abordagens

\n\n

Agora a parte mais interessante — a performance da geração de números aleatórios em JavaScript. Suponha que você precise criar 10.000 pontos aleatórios em um canvas. Cada milissegundo conta.

\n\n

Testamos três abordagens:

\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n
AbordagemCódigoTempo (10 milhões de iterações)
Clássica (com arredondamento)Math.floor(Math.random() * (max - min + 1)) + min~180 ms
Com operador bitwise OR (truque)(Math.random() * (max - min +

Blogs

Book Recommendations