Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] Como sortear números aleatórios sem repetir no mesmo resultado?

Escrevi o código abaixo com auxilio de um tutorial, mas notei que o código permite que sejam sorteados números iguais no mesmo resultado. Preciso de ajuda para evitar a repetição. Por exemplo, coloquei para sortear 4 números de 1 a 5 e o resultado foi "1,2,2,2". Segue o código:


```async function sortear () {
    const totalResultados = Number(document.querySelector('#totalResultadosInput').value);
    
    const menorValor = Number(document.querySelector('#menorValorInput').value);
    
    const maiorValor = Number(document.querySelector('#maiorValorInput').value);

    
    for(let efeito = 0; efeito < 20; efeito++) {

        const elementoHTMLResultValues = document.querySelector('.results-values');
        elementoHTMLResultValues.innerHTML = ''

        for(let qntResultados = 0; qntResultados < totalResultados; qntResultados++) {
            const resultado = Math.floor((Math.random() * (maiorValor - menorValor + 1)) + menorValor);

            const elementoHTMLDoResultado = document.createElement('div');
            elementoHTMLDoResultado.classList.add('result-value');
            elementoHTMLDoResultado.innerText = resultado;


            elementoHTMLResultValues.append(elementoHTMLDoResultado);
        }
        await wait(20)
    }
}

function wait(tempo) {
    return new Promise((resolve) => {
        setTimeout(() => resolve(), tempo)
    })
}
2 respostas
solução!

Seu código está quase lá! O problema de números repetidos acontece porque o Math.random() não tem nada que impeça ele de escolher o mesmo número mais de uma vez. Para evitar a repetição, você pode usar um array (lista) para armazenar os números que já foram sorteados. Daí, cada vez que você sorteia um número novo, verifica se ele já está na lista. Se estiver, sorteia de novo até conseguir um número que ainda não foi sorteado.

Aqui vai uma versão ajustada do seu código: async function sortear() { const totalResultados = Number(document.querySelector('#totalResultadosInput').value); const menorValor = Number(document.querySelector('#menorValorInput').value); const maiorValor = Number(document.querySelector('#maiorValorInput').value);

for (let efeito = 0; efeito < 20; efeito++) {
    const elementoHTMLResultValues = document.querySelector('.results-values');
    elementoHTMLResultValues.innerHTML = '';

    const numerosSorteados = [];

    for (let qntResultados = 0; qntResultados < totalResultados; qntResultados++) {
        let resultado;
        do {
            resultado = Math.floor((Math.random() * (maiorValor - menorValor + 1)) + menorValor);
        } while (numerosSorteados.includes(resultado));  // Verifica se o número já foi sorteado

        numerosSorteados.push(resultado);  // Adiciona o número sorteado na lista para não repetir

        const elementoHTMLDoResultado = document.createElement('div');
        elementoHTMLDoResultado.classList.add('result-value');
        elementoHTMLDoResultado.innerText = resultado;

        elementoHTMLResultValues.append(elementoHTMLDoResultado);
    }
    await wait(20);
}

}

function wait(tempo) { return new Promise((resolve) => { setTimeout(() => resolve(), tempo); }); }

O que eu mudei:

Criei um array chamado numerosSorteados para armazenar os números que já foram sorteados. Dentro do for que sorteia os números, adicionei um do...while que sorteia um número e, se esse número já estiver no array numerosSorteados, ele sorteia de novo até encontrar um número que ainda não foi sorteado. Adicionei o número novo no array com numerosSorteados.push(resultado). Agora, os números sorteados não vão mais se repetir no mesmo resultado!

Muito obrigado Davi