8
respostas

repetição dos numeros iguais.

Não consigo entender a lógica para que não se repita os números iguais.

Alguem pode me ajudar? estou com muitas duvidas nessa Aula.

8 respostas

Insira aqui a descrição dessa imagem para ajudar na acessibilidadeAqui também está voltando números repetidos, inclusive 0.

Olá, Diego, tudo bem?

Primeiramente parabéns por ter chegado às últimas aulas do curso!

Você poderia dizer suas dúvidas específicas para que possamos te ajudar melhor! De qualquer forma, vou te mostrar passo a passo de como implementar essa parte, ok? Espero que te ajude.

Vamos considerar o código da função sorteiaNumeros, antes do instrutor implementar a lógica de impedir números repetidos:

    function sorteiaNumeros(quantidade) {

        var segredos = [];

        var numero = 1;

        while (numero <= quantidade) {

            var numeroAleatorio = sorteia();  // Sorteamos um novo número
            segredos.push(numeroAleatorio);  // Adicionamos o novo número
            numero++;

        }

        return segredos;
    }

O que essa função faz é receber uma quantidade como parâmetro e retornar um array segredos com a quantidade de números aleatórios infromada. Para isso, utilizamos o bloco while e a variável numero, que é como se fosse uma variável contadora (você pode renomeá-la para cont, se preferir).

Então sempre que um novo número é sorteado e adicionado a segredos, somamos 1 ao valor de numero, e quando numero for maior que a quantidade informada, o bloco while é quebrado!

Mas antes de executar a linha segredos.push(numeroAleatorio), devemos percorrer o array para conferirmos se o novo número gerado já existe dentro do array segredos!

Faremos isso utilizando o bloco for:

    function sorteiaNumeros(quantidade) {

        var segredos = [];

        var numero = 1;

        while (numero <= quantidade) {

            var numeroAleatorio = sorteia();  // Sorteamos um novo número

            for (var posicao = 0; posicao < segredos.length; posicao++) {
                // Aqui dentro devemos conferir se no array "segredos" já existe um número igual ao que foi gerado
            }

            segredos.push(numeroAleatorio);  // Adicionamos o novo número
            numero++;
        }

        return segredos;
    }

Se você tiver alguma dúvida de como o bloco for funciona, pode falar, ok?

Mas do jeito que o código está, o comando segredos.push(numeroAleatorio); adicionará o novo número no array segredos de qualquer jeito! Precisamos então de um bloco if, que adiciona o novo número gerado apenas se ele não existir dentro do array. Podemos então criar uma variável auxiliar chamada achou!

Iremos declarar essa variável inicialmente com o valor false, antes de percorrermos o array segredos. Em seguida, ao percorrer o array, iremos alterar o valor de achou para true apenas se encontrarmos um número igual a numeroAleatorio.

E por fim, iremos executar segredos.push(numeroAleatorio) apenas se achou for igual a false, pois isso quer dizer que numeroAleatorio ainda não existe dentro do array, e podemos adicioná-lo com segurança! E se achou for igual a true, quer dizer que o número já existe dentro do array e não iremos adicionar o novo número!

Vamos por partes, primeiro criaremos a variável achou logo antes de percorrermos o array, e o bloco if para adicionar ou não o novo número dentro do array:

    function sorteiaNumeros(quantidade) {

        var segredos = [];

        var numero = 1;

        while (numero <= quantidade) {

            var numeroAleatorio = sorteia();  // Sorteamos um novo número

            var achou = false;    // Inicializamos a variável com valor "false"

            for (var posicao = 0; posicao < segredos.length; posicao++) {
                // Aqui dentro devemos conferir se no array "segredos" já existe um número igual ao que foi gerado
                // Se encontrarmos, alteraremos o valor de "achou" para "true"
            }

            if (achou == false) {    // Adicionaremos "numeroAleatorio" apenas se "achou" for igual a "false"!
                segredos.push(numeroAleatorio);
                numero++;
            }
        }

        return segredos;
    }

Continuarei no próximo post!

Agora falta apenas implementarmos a lógica dentro do for! A variável posicao indicará a posição de cada elemento do array, então poderemos acessar cada elemento se usarmos segredos[posicao]. Então, começando na posição 0, iremos conferir (de um em um) se algum elemento do array é igual a numeroAleatorio. Se houver pelo menos um elemento igual a numeroAleatorio, alteraremos o valor de achou para true! Assim:

    function sorteiaNumeros(quantidade) {

        var segredos = [];

        var numero = 1;

        while (numero <= quantidade) {

            var numeroAleatorio = sorteia();  // Sorteamos um novo número

            var achou = false;  // Inicializamos a variável com valor "false"

            for (var posicao = 0; posicao < segredos.length; posicao++) {
                if (segredos[posicao] == numeroAleatorio) {  // Aqui conferimos se cada um dos elementos é igual a "numeroAleatorio".
                    achou = true;  // Se pelo menos um dos elementos é igual, alteramos o valor de "achou" para "true"!
                    break;  // Aqui usamos o break para interromper a execução do "for", pois não é mais necessário procurar mais algum número igual ao novo gerado.
                }
            }

            if (achou == false) {  // Adicionaremos "numeroAleatorio" apenas se "achou" for igual a "false"!
                segredos.push(numeroAleatorio);
                numero++;
            }
        }

        return segredos;
    }

Nosso programa está quase pronto! Por fim, queremos adicionar o novo número gerado apenas se ele for diferente de 0! Então, logo depois de sortearmos o número, adicionaremos um bloco if, que executará todo o código apenas se numeroAleatorio !== 0:

    function sorteiaNumeros(quantidade) {

        var segredos = [];

        var numero = 1;

        while (numero <= quantidade) {

            var numeroAleatorio = sorteia();  // Sorteamos um novo número

            if (numeroAleatorio !== 0) {  // Executará o restante do código apenas se o número gerado não for 0. Se for 0, voltaremos ao início do "while".

                var achou = false;

                for (var posicao = 0; posicao < segredos.length; posicao++) {

                    if (segredos[posicao] == numeroAleatorio) {  // Aqui conferimos se cada um dos elementos é igual a "numeroAleatorio".
                        achou = true;  // Se pelo menos um dos elementos é igual, alteramos a valor de "achou" para "true"!
                        break;  // Aqui usamos o break para interromper a execução do "for", pois não é mais necessário procurar mais algum número igual ao novo gerado.
                    }
                }

                if (achou == false) {  // Adicionaremos "numeroAleatorio" apenas se "achou" for igual a "false"!
                    segredos.push(numeroAleatorio);
                    numero++;
                }
            }
        }

        return segredos;
    }

É isso, espero ter ajudado! Se ficou alguma dúvida, estaremos aqui para te auxiliar! Bons estudos :)

Oi Antônio,

O problema dos números repetidos foi solucionado com a tua explicação, obrigado. Porém ainda estou recebendo o número 0 em um dos números sorteados:

<meta charset="UTF-8">

<input/>
<button>Compare com o meu segredo</button>

<script>

    function sorteia(){

        return  Math.round(Math.random() * 10);
    }

    function sorteiaNumeros(quantidade){

        var segredos = [];
        var numero = 1;

        while (numero <= quantidade) {

            var numeroAleatorio = sorteia();

            if (numeroAleatorio !== 0){

                var achou = false;

                for (var posicao = 0; posicao < segredos.length; posicao++){

                    if(segredos[posicao] == numeroAleatorio){

                    achou = true;
                    break;
                    }
                }    
            }


            if (achou == false){ 

                segredos.push((numeroAleatorio));
                numero++;

            }

        }

        return segredos;
    } 

    var segredos = sorteiaNumeros(5);


    console.log(segredos);

    var input = document.querySelector("input");
        input.focus();

    function verifica() {

        var achou = false;

        for(var posicao = 0; posicao < segredos.length; posicao++) {

        if(input.value == segredos[posicao]) {

            alert("Você ACERTOU!");
            achou = true;
            break;
        }                    
    }

    if(achou == false) {
        alert("Você ERROU!");
    }

    input.value = "";
    input.focus();

    }   

    var button = document.querySelector("button");

    button.onclick = verifica;


</script>

Onde eu estou errando?

Math.round(Math.random() * 10);

Trocar a função round() por ceil()

A ceil arredonda qualquer valor com casa decimal pro proximo numero inteiro, a round deixa no mesmo numero se o valor dass casas decimais forem menor do que 0,5 e se for maior ou igual ela arredonda pro proximo numero inteiro.

Agradeço pela sugestão e realmente funciona.

Como o professor utiliza o round, queria saber o motivo do código dele não estar retornando 0 e o meu sim!

Tranquilo, eu não cheguei a ver o código dele, mas verifica se ele esta somando 1 nessa função ou algo do tipo:

Math.round(Math.random() * 10) +1;

E usando o round nesse caso, acho que geraria um numero a mais, tipo de 1 a 11 nesse caso. e o seu esta gerando de 0 a 10.

chegou a verificar isso tb?

Sim, está praticamente igual ao do professor (alguma coisa deve estar diferente, por isso deve estar voltando 0 hehe). Vou dar uma olhada e aviso aqui quando resolver. Por enquanto, obrigado pela ajuda de vocês!