Gerar vários números aleatórios sem repetição em JavaScript

Neste artigo você vai aprender a gerar vários números aleatórios sem repetição em JavaScript, utilizando os próprios recursos da linguagem

Gerar vários números aleatórios sem repetição capa

Fala programador(a), beleza? Bora aprender mais sobre geração de números aleatórios em JavaScript!

Primeiramente vamos criar uma lista ordenada, com o máximo de números aleatórios que precisamos gerar sem repetição

Veja como fica o código:

const maxNumbers = 10;
let list = [];

for (let i = 0; i < maxNumbers; i++) {
   list[i] = i + 1;
}

console.log(list); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Agora vamos embaralhar o número neste mesmo array, então os números não se repetirão

E teremos uma lista com números únicos

Veja como embaralhar a lista:

let randomNumber;
let tmp;

for (let i = list.length; i;) {
    randomNumber = Math.random() * i-- | 0;
    tmp = list[randomNumber];
    // troca o número aleatório pelo atual
    list[randomNumber] = list[i];
    // troca o atual pelo aleatório
    list[i] = tmp;
}


console.log(list); // 2, 3, 7, 1, 6, 8, 4, 5, 9, 10

Agora temos uma lista aleatório de x números, onde x foi definido na primeira parte do nosso algoritmo, pela variável maxNumbers

E é claro, o resultado da segunda parte pode variar pela quantidade de números e também pela aleatoriedade empregada no algoritmo

Porém é interessante como a solução é simples, apenas reposicionando os números de uma lista previamente criada

O nome desse algoritmo é Fisher-Yates, você pode saber mais clicando aqui

Ele é muito utilizado para reordenação aleatória de listas

Conclusão

Neste artigo vimos como gerar vários números aleatórios sem repetição com JavaScript

Utilizamos o algoritmo Fisher-Yates, que foi explicado acima

Desta forma geramos uma lista, que embaralha os seus números e gera uma lista de números aleatórios únicos

Confira também nosso catálogo de cursos gratuitos, com aulas semanais no YouTube

Fala, tu viu que a lista sempre começa em 1 e vai até maxNumbers, né?

Mas e se tu precisar de números dentro de um intervalo, tipo de 50 a 60, sem repetir?

A sacada é a mesma: primeiro monta a lista com todos os valores possíveis do intervalo, depois embaralha

Só muda a hora de preencher o array:

const min = 50; const max = 60;

for (let i = min; i <= max; i++) { list.push(i); }

Depois é só rodar o mesmo embaralhamento do Fisher-Yates que a gente viu ali em cima

E tu tem os números do intervalo em ordem aleatória, todos únicos, sem repetição =)

Às vezes tu não quer a lista inteira embaralhada

Quer só 3 números aleatórios sem repetição, por exemplo

Depois de embaralhar, é só fatiar o array com o slice:

const quantidade = 3; let sorteados = list.slice(0, quantidade);

console.log(sorteados); // 3 primeiros da lista já embaralhada

Como a lista já foi misturada pelo Fisher-Yates, pegar os primeiros itens é o mesmo que sortear aleatório

E por causa disso, nenhum se repete =)

Repara que o coração do embaralhamento é o Math.random

Mas o que ele faz mesmo?

O Math.random devolve um número quebrado maior ou igual a zero e menor que um

Multiplicando esse valor pela quantidade de itens e cortando a parte decimal com o | 0, a gente transforma isso num índice válido do array

É esse índice que decide qual posição vai ser trocada a cada passo do laço

Perguntas frequentes

Como garantir que os números não se repetem?

O segredo é não sortear número por número, e sim montar uma lista com todos os valores possíveis e só embaralhar essa lista

Como cada valor aparece uma única vez na lista original, é impossível repetir depois de misturar

Dá pra usar o mesmo código para sortear letras ou nomes?

Dá sim

O Fisher-Yates embaralha qualquer array, então serve pra números, letras, nomes, o que tu colocar dentro da lista

Por que não usar só Math.random direto num intervalo?

Porque sorteando solto tu pode cair no mesmo número duas vezes

Aí teria que ficar checando se já saiu, e isso vai ficando lento conforme a lista cresce

Embaralhar a lista inteira resolve isso de um jeito bem mais simples

Leia também

Subscribe
Notify of
guest

2 Comentários
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Nycole

muito obrigada!!

Battisti

de nada =)

Formações

Formação Vibe Coding

Formação Vibe Coding

Do Prompt ao Produto: Crie Software Real com IA

  • 473 aulas
  • 20 projetos
  • 39h 26min

Blog | Mais populares