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

[Bug] Mão na massa: proteção no total de números sorteados

Fiz essa implementação abaixo, porém em casos específicos ela não funciona.

if(quantidadeParaSortear <=de || quantidadeParaSortear <=ate){
        alert(`A quantidade de números a sortear deve ser menor ou igual ao intervalo informado em "Do Número" e "Até o Número". Verifique!`)
        reiniciar();
        return;

Ao testar no exemplo do desafio, tudo ocorreu bem (Gerar 5 números entre 10 e 13) . Porém, ao testar esse cenário abaixo ela não foi executada. Poderiam me ajudar a solucionar ou dizer o porquê do erro? Eu vi a opinião do instrutor mas não entendi o raciocínio pro algoritmo ser if (quantidade > (ate - de + 1), quero ver se minha lógica poderia ser melhorada. Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Ponho abaixo o código completo caso exista mais erros:

function sortear() {
   var quantidadeParaSortear = parseInt(document.getElementById('quantidade').value);
   var de = parseInt(document.getElementById('de').value);
   var ate = parseInt(document.getElementById('ate').value);
   if(de>=ate){
    alert(`O valor inicial de sorteio (${de}) tem que ser maior que o valor limite (${ate}). Verifique e tente novamente!`);
    return;
   }

   let sorteados = [];
   let numero;

   for (var i = 0; i < quantidadeParaSortear; i++) {
    numero = obterNumeroAleatorio(de, ate);

    while (sorteados.includes(numero)){
       numero = obterNumeroAleatorio (de, ate);
    }
    if(quantidadeParaSortear <=de || quantidadeParaSortear <=ate){
        alert(`A quantidade de números a sortear deve ser menor ou igual ao intervalo informado em "Do Número" e "Até o Número". Verifique!`)
        reiniciar();
        return;
    }
    sorteados.push(numero);
   }

  var resultado = document.getElementById('resultado');
  resultado.innerHTML = `<label class="texto__paragrafo">Números sorteados:  ${sorteados}</label>`;
  changeBotaoReiniciar();
}

function obterNumeroAleatorio(min, max) {
    return(Math.floor(Math.random() * (max - min + 1)) +(min));
    
}
function changeBotaoReiniciar(){
     var botao = document.getElementById('btn-reiniciar');
     if (botao.classList.contains('container__botao-desabilitado')) {
        botao.classList.remove('container__botao-desabilitado');
        botao.classList.add('container__botao');
     } else {
        botao.classList.remove('container__botao');
        botao.classList.add('container__botao-desabilitado');
     }

}
function reiniciar() {

document.getElementById('quantidade').value = '';
document.getElementById('de').value = '';
document.getElementById('ate').value = '';
document.getElementById('resultado').innerHTML = '<label class="texto__paragrafo">Números sorteados:  nenhum até agora</label>';
changeBotaoReiniciar();

}
2 respostas

Oi, Gabriel.

Acho que você está implementando uma lógica diferente da do seu instrutor.

No seu caso, você está implementando a lógica de que:

  • se a quantidade for menor que de OU
  • se a quantidade for menor que até

O código deve executar o bloco if.

Eu entendi no seu caso que o que você quis fazer foi delimitar a quantidade de números para ser entre de e até, neste caso, o certo seria mudar para:

  • se a quantidade for maior que até

No exemplo funciona pois 5 é menor ou igual a 10 OU 5 é menor ou igual a 13, satisfazendo qualquer uma das condições. Mas no seu próprio teste, 10 não é menor ou igual a 1, OU 10 não é menor ou igual a 5: não satisfaz nenhuma das duas condições, e o bloco if nunca é executado.

O instrutor, no entanto, está falando sobre delimitar a quantidade de números sorteados pela diferença (subtração) entre de e até.

// o código abaixo funciona porque a quantidade de números sorteados deve ser menor que a diferença entre as duas variáveis. 
// Mas por que o +1?
// Porque a diferença entre 15 e 10, por exemplo, é 5, no entanto temos que levar em conta o numero 10 também, 
// pois ele está incluído na nossa lista de números possíveis a serem sorteados, 
// portanto o nosso intervalo é de 6 números, e não 5 [10, 11, 12, 13, 14, 15].

if (quantidade > (ate - de + 1)) {
    alert('Campo "Quantidade" deve ser menor ou igual ao intervalo informado no campo "Do número" até o campo "Até o número". Verifique!');
    return;
  }

Espero que tenha ajudado, e bons estudos!

solução!

Ah, vale lembrar que se você implementar a mudança para js quantidade>=ate você pode incorrer em um loop infinito, que é o que está sendo solucionado pelo instrutor neste caso. Só é possível escolher 11 números entre 10 e 13, por exemplo, se houver a possibilidade de repetir números, caso contrario, os números escolhidos podem ser 4 [10, 11, 12, 13], e não 11.

Aqui é uma questão de escolha caso a caso. Se for implementar o seu código, você deve remover o limitador de números repetidos.