2
respostas

[Projeto] Projeto - Sorteador de números aleatórios - Resolução alternativa

Olá! Tudo bem?

Estou no curso de lógica de programação, na parte de prática com desafios. No primeiro desafio, o sorteador de números aleatórios, eu resolvi fazer sem assistir a aula, para ver se conseguia chegar na resolução. Eu fiz e, nos meus testes, funcionou super bem, mas ao assistir a aula, vi que os professores fizeram de uma forma bem diferente da que fiz. Gostaria de saber se o que fiz teria algum problema ou se, de alguma forma, seria menos eficiente em comparação a resolução dada na aula. Obrigado!

Código: https://github.com/ewertonvn/Sorteador-de-numeros-aleatorios.git
Deploy: https://ewertonvn.github.io/Sorteador-de-numeros-aleatorios/

2 respostas

Oi, Ewerton! Tudo bem?

Que iniciativa fantástica! Tentar resolver o desafio antes de assistir à aula é uma das melhores maneiras de testar e consolidar o conhecimento. Parabéns por se desafiar assim!

Realmente os códigos são diferentes e, o mais interessante, é que cada um tem um ponto forte que o outro não tem!

O Ponto FORTE do seu código: Validações!

Você fez duas validações que são excelentes:

Valores válidos: Você checa se os números são NaN, se o início é maior que o fim, etc. (if (quantidadeDeNumeros <= 0 ...)). Ótimo!

Intervalo suficiente (A MAIS IMPORTANTE):

if (fimIntervalo - inicioIntervalo + 1 < quantidadeDeNumeros) {
    alert("Intervalo insuficiente...");
    return;
}

Essa sua validação é crucial. Se o usuário pedisse para sortear 10 números, mas o intervalo fosse apenas de 1 a 5, o seu código avisa o usuário e para.

Os Pontos Fracos (Bugs) do seu código

Apesar da validação excelente, a sua lógica de sorteio tem dois problemas principais que a solução da aula corrige:

O Intervalo (O "De"):
Sua fórmula para sortear está assim:

numerosSorteados.push(parseInt(Math.random() * fimIntervalo + 1));

Perceba que você não está usando a variável inicioIntervalo. Seu código sempre sorteia um número entre 1 e o fimIntervalo. Se o usuário pedir números "De 10" "Até 15", o seu código vai sortear entre 1 e 15.
Insira aqui a descrição dessa imagem para ajudar na acessibilidade

A solução da aula usa uma função separada (obterNumeroAleatorio(min, max)) com a fórmula correta para respeitar o início e o fim do intervalo:
Math.floor(Math.random() * (max - min + 1)) + min

Números Repetidos:
O seu loop while apenas sorteia um número e o adiciona na lista (numerosSorteados.push(...)). Ele não confere se aquele número já foi sorteado antes.
Por isso, no seu código, se você pedir 3 números, pode receber um resultado como [5, 8, 5].

A solução da aula resolve isso com este trecho:

while (sorteados.includes(numero)) {
    numero = obterNumeroAleatorio(de, ate);
}

Isso garante que, se um número repetido for sorteado, o código "tenta de novo" até encontrar um número único.

Conclusão

  • O seu código é seguro? Sim! Sua validação de intervalo (if (fimIntervalo...) previne um crash (loop infinito).

  • **Já o código da aula, ele garante as duas regras principais do desafio: respeitar o intervalo e sortear números únicos.

A "solução perfeita" seria uma fusão dos dois: pegar as suas validações (principalmente a do tamanho do intervalo) e usá-las junto com a lógica de sorteio e verificação de duplicados da aula.

Sua percepção foi excelente e a lógica que você montou é muito boa. Continue com essa atitude de tentar resolver os problemas sozinho primeiro!

Bons estudos!

Sucesso

Imagem da comunidade

Excelente! Muito obrigado pelo rápido retorno. Esse foi um ponto que pensei durante meus testes, mas acabei deixando passar. Fiz uma modificação pra corrigir. Também já incluí uma validação para que ele não sorteie números repetidos. Fiz com um if e o VS Code me sugeriu usar o "continue". Ainda não conhecia e fui pesquisar e vi que provavelmente resolveria. Ficou assim:

 while (quantidadeDeNumeros > 0) {
       let numeroaleatorio = (parseInt(Math.random() * fimIntervalo + 1));
         if (numeroaleatorio < inicioIntervalo) {
            continue;
         }
            if (numerosSorteados.includes(numeroaleatorio)) {
                continue;
            }
       numerosSorteados.push(numeroaleatorio);
         quantidadeDeNumeros--;
    }

Já atualizei também no Github. Muito obrigado!