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

Não consigo fazer com que não repita o número

Boa noite!

Tentei seguir da minha lógica e novas soluções para o exercício 9, mas fiquei travado em não conseguir fazer com que o número dentro do vetor não se repita. Mesmo comparando meu código com o original, não consegui encontrar onde estou errando na lógica, alguém da uma help?

Segue o código:

<script>
    var nums = [];
    var i = 1;
    var reference = 5;

    function draw() {
        return Math.round(Math.random()*10);
    }

    var position = 0;

    while (i <= reference){
        var randomNum = draw();
        var checkIfMatch = false;

        if (randomNum != 0){
            while (position < nums.length){
                if (nums[position] == randomNum){
                    checkIfMatch = true;
                    break;
                }
            }
            if(checkIfMatch == false){
                nums.push(randomNum);
                position++
            }
            i++
        }
    } 

    console.log(nums);

</script>
8 respostas
solução!

Olá Guilherme.

Eu não tenho o descritivo do exercício, mas vamos analisar seu código, mais especificamente nesse bloco:

while (position < nums.length){
    if (nums[position] == randomNum){
       checkIfMatch = true;
       break;
    }
 }

Você indica pro código executar esse bloco enquanto a variável position for menor que o tamanho do vetor, porém as duas variáveis iniciam com o mesmo valor (0) e são incrementadas no mesmo bloco:

if(checkIfMatch == false){
   nums.push(randomNum);
   position++
}

Você não as altera em nenhum outro local, logo essa condição nunca será verdadeira. As duas sempre terão o mesmo valor, já que iniciam com o mesmo valor e o incremento é sempre de 1 em 1. Uma saída seria iterar a variável position sempre no final do seu while interno e sempre zerar o valor no início do seu while principal, para que possar percorrer novamente todos os elementos do vetor procurando um match com o novo número randômico. Existem formas mais interessantes de resolver esse problema, mas por ora eu recomendaria a utilização de um laços for ao invés dos whiles. Ele já tem um parâmetro de incremento de variável sem precisar ficar incrementando na mão em toda execução.

[]'s.

Opa! Fala aí, Bruno!

Então, a ideia (nessa parte) do exercício é que o sistema crie um vetor de números aleatórios mas que nenhum valor se repita e que não seja igual a 0

Cara, e tentei fazer a alteração que vc indicou e parece que me salvou hahaha

<script>
    var nums = [];
    var i = 1;
    var reference = 5;

    function draw() {
        return Math.round(Math.random()*10);
    }

    var position = 0;

    while (i <= reference){
        var randomNum = draw();
        var checkIfMatch = false;

        if (randomNum != 0){
            for(position = 0; position < nums.length; position++){
                if (nums[position] == randomNum){
                    checkIfMatch = true;
                    break;
                }
            }
            if(checkIfMatch == false){
                nums.push(randomNum);
                i++
            }    
        }
    } 

    console.log(nums);

</script>

Pelo o que eu entendi então, dessa forma sempre que executo o while (i <= reference) ele vai sempre checar o for(position = 0; position < nums.length; position++) partindo do 0, enquanto o randomNum já vai ter um valor. O for vai checar desde a posição 0 até a posição que ainda for menor que o vetor, correto?

E como dessa vez coloquei o i++ dentro do if(checkIfMatch == false) eu só "gasto" um i caso meu vetor tenha "puxado" um valor.

Isso. Agora, você consegue imaginar o que aconteceria com o seu código caso seu fator de multiplicação pro número randômico fosse 4, por exemplo?

Iria ficar num loop infinito, acredito eu hahahaha Porque ele criaria 4 números de 1 a 4 e o quinto número seria impossível, já que não poderia repetir e nem ser 0. O programa ia gerar um número sempre repetido ou zero e sempre retornaria true para o checkIfMatch...

Nesse caso, eu teria que mudar o valor da variável reference pra um número menor, certo?

Boa, ficaria num loop infinito.

Então, tudo depende do propósito do código. Como o reference é o que limita o tamanho do seu vetor de números randômicos, não faz sentido ele ser maior que o fator de multiplicação. Inclusive, nem igual, porque você descarta o 0.

Uma coisa que daria pra mudar pra não cair no loop infinito seria iterar seu i independente de dar match ou não, mas aí você não garante que terá 5 números. Enfim, tudo depende do que você quer, só quis mostrar opções possíveis. Pode ser que essa minha sugestão não faça sentido nesse caso, mas pode fazer em outro. Sempre bom pensar que iterar uma variável de um laço só em um caso específico pode te trazer esse tipo de problema.

Beleza! Vou ficar atento em todas as possibilidades. Eu meio que já tento sair um pouco da "asa" das vídeo aulas como nesse exemplo. Tentei partir da minha lógica e, comparando com o código vídeo, encurtei alguns processos!

Mas valeu mesmo pela ajuda, iluminou muito o meu caminho, obrigado!

Boa! Esse é um bom caminho :)

Abs.

Olá Guilherme, tudo bem?

Como o seu problema foi resolvido, estou fechando o tópico, ok?