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

[Dúvida] [Dúvida] Alert entra em Loop - Proteção no Total de Números Sorteados

Olá,

Estou presa no "Mão na massa: proteção no total de números sorteados", quando coloco para executar no live, o alerta fica constantemente aparecendo na tela, não deixando corrigir os números.

Bug no Alert do Código

Segue o meu código:

    for (let i = 0; i < quantidade; i++) {
        numero = obterNumeroAleatorio(de, ate);

        while (sorteados.includes(numero)) {
            numero = obterNumeroAleatorio(de, ate);
            alert("Calma lá, também não dá pra inventar. Verifique os campos abaixo e tente novamente.");
        }

        sorteados.push(numero);
    }

Será que também pode ser algum outro erro em outra parte do código?

Obrigada desde já.

5 respostas

Oi!

O seu código está correto, nesse trecho que você mandou. O problema é que você fez o teste pedindo para sortear 5 números, entre 11 e 14. Mas entre 11 e 14 somente existem 4 números possíveis e o loop vai ficar infinito por conta disso.

A validação para evitar essa situação deve ser feita antes desse loop for, para garantir que somente vai entrar no loop se os valores digitados na tela forem válidos.

Olá, obrigada pela resposta.

Entendi, estava tentando por em prática o "Mão na massa: proteção no total de números sorteados", onde usei o código apresentado, antes ele funcionava normalmente, sem entrar nesse loop. Porém quando adicionei o código da prática "Mão na massa: proteção na entrada de valores", começou a acontecer isso.

A melhor resolução seria remover essa parte do total de números sorteados?

acho que poderia implementar um IF, com a condição do numero de numeros sorteados (5) ser maior que o numero de intervalo (11 e 14 so tem 4 numeros) mandando um alert pro usuario diminuir o numero de valores sorteados que pediu

solução!

Adicionando esse if, antes do loop for, deve resolver:

let intervalo = ate - de + 1;
if (quantidade > intervalo) {
    alert('quantidade inválida para o intervalo digitado!');
    
    // esse return serve para interromper a function sortear() e não executar o loop abaixo
    return;
}

for (let i = 0; i < quantidade; i++) {
    numero = obterNumeroAleatorio(de, ate);

    while (sorteados.includes(numero)) {
        numero = obterNumeroAleatorio(de, ate);
        alert("Calma lá, também não dá pra inventar. Verifique os campos abaixo e tente novamente.");
    }

    sorteados.push(numero);
}

Obrigada, consegui resolver com o acréscimo do let/if!