Gerar números inteiros aleatórios em JavaScript em um intervalo específico?
Como posso gerar números inteiros aleatórios entre duas variáveis especificadas em JavaScript, por exemplo x = 4
e y = 8
, que sairiam qualquer um de 4, 5, 6, 7, 8
?
1823
3
Há alguns exemplos na página Mozilla Developer Network:
Aqui está a lógica por trás disso. É uma regra simples de três:
Math.random()
retorna umNúmero
entre 0 (inclusive) e 1 (exclusivo). Então nós temos um intervalo como este:Agora, gostaríamos de um número entre
min
(inclusive) emax
(exclusivo):Podemos utilizar o
Math.random
para obter o correspondente no intervalo [min, max). Mas, primeiro devemos considerar um pouco o problema subtraindo omin
do segundo intervalo:Isto dá:
Podemos agora aplicar
Math.random
e depois calcular o correspondente. Vamos escolher um número aleatório:Então, para encontrar o
x
, nós faríamos:Não se esqueça de adicionar
min
de volta, para que tenhamos um número no intervalo [min, max]:Essa foi a primeira função da MDN. A segunda, retorna um número inteiro entre
min
emax
, ambas inclusivas.Agora para obter números inteiros, você poderia usar "redondo", "tecto" ou "chão".
Você poderia utilizar
Math.round(Math.random() * (max - min)) + min
, isto no entanto dá uma distribuição não uniforme. Ambos,min
emax
só têm aproximadamente metade da chance de rolar:Com o
max
excluído do intervalo, tem ainda menos chance de rolar do que omin
.Com
Math.floor(Math.random() * (max - min +1)) + min
você tem uma distribuição perfeitamente uniforme.Você não pode utilizar
ceil()
e-1
nessa equação porquemax
agora tinha um pouco menos de chance de rolar, mas você pode rolar o resultado (indesejado)min-1
também.uso:
Para testar esta função, e variações desta função, salve o HTML/JavaScript abaixo em um arquivo e abra com um navegador. O código produzirá um gráfico mostrando a distribuição de um milhão de chamadas de função. O código também registrará os casos de borda, então se a função produzir um valor maior que o máximo, ou menor que o mínimo, você.saberá.sobre.ele.