1
resposta

[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/

Matricule-se agora e aproveite até 50% OFF

O maior desconto do ano para você evoluir com a maior escola de tecnologia

QUERO APROVEITAR
1 resposta

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