Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Dúvida sobre a função sorteiaNumeros

Estou tendo uma dificuldade em entender essa parte do código, não estou conseguindo entender a lógica:

function sorteiaNumeros(quantidade) {  

        var segredos = [];    

        var numero = 1;    

        while(numero <= quantidade) {    

              var numeroAleatorio = sorteia();
              var achou = false;

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

                           if(segredos[posicao] == numeroAleatorio){
                                achou = true;
                                break;
                           }

                     }

                     if (achou == false) {
                           segredos.push(numeroAleatorio);
                           numero++;
                     }
              }

        }

        return segredos;

    }

Teria algum jeito de me explicar de outra forma? Agradeço

1 resposta
solução!

Oi Matheus, tudo bom? Deixa eu ver se consigo te ajudar.

Reescrevi a função sorteiaNumeros de uma forma que seja mais descritiva para tentar te ajudar. O que queremos fazer com essa função é criar uma lista de números aleatórios. Sendo que essa lista não pode ter nenhum número 0 e nenhum número repetido.

Toda função que criamos, pode receber algumas informações para ajudar ela na hora da execução. Assim não precisamos duplicar código para ter uma função que crie uma lista de segredos com 10 segredos e outra função que crie uma lista de 5 segredos.

//declaração de uma função que recebe como informação (parâmetro) uma variável que chamamos de quantidade desejada. 
function SorteiaNumeros(quantidadeDesejada) { ... } 

Com essa informação podemos criar uma lista de números do tamanho que quisermos, basta passar um número diferente quando chamarmos essa função.

Assim que o a sorteiaNumeros for chamada, criamos uma variável local - que só pode ser acessada dentro dessa função - chamada listaDeSegredos. Como o próprio nome diz essa variável guarda uma lista e por isso iniciamos ela com um array []

function SorteiaNumeros(quantidadeDesejada) {  
    var listaDeSegredos = [];    
}

Em seguida entramos em um loop de execução, ou seja vamos ficar presos nesse loop enquanto a condição que passamos para ele for verdadeira. No nosso caso estamos vendo se a lista de segredos já está do tamanho desejado. Enquanto ela não estiver, nós vamos gerar um numero aleatório e tentar colocar ele dentro da lista mas, só faremos isso se duas condições forem verdadeiras.

  • 1: O número não pode ser zero
  • 2: Não pode ser um número repetido.

Conforme vamos adicionando números o tamanho da lista cresce e em algum momento vamos sair do laço while e nesse momento sabemos que terminamos de criar a lista e podemos devolver ela para quem quer que tenha pedido - quem chamou essa função.

function SorteiaNumeros(quantidadeDesejada) {  
    var listaDeSegredos = [];    

    while(listaDeSegredos.length <= quantidadeDesejada) {    

        var numeroSorteado = Sorteia();
        if(NumeroDiferenteDeZero(numeroSorteado)){
            if(NaoEstaNaLista(numeroSorteado, listaDeSegredos)){
                listaDeSegredos.push(numeroSorteado);
            }
        }
    }

    return listaDeSegredos;
}

Como eu falei eu reescrevi o código e quebrei ele nós problemas que queremos resolver, assim tenho uma função para cada problema. E se você ver eu estou apenas chamando essas funções dentro da sorteiaNumeros assim deve ficar mais fácil de entender a lógica. Mas vamos ver como cada uma dessas funções é implementada?

A função numeroDiferenteDeZero recebe como informação o numero que ela deve verificar e retorna um valor verdadeiro ou falso para quem quer que tenha chamado ela.

function NumeroDiferenteDeZero(numero){
    return numero !== 0
}

A função NaoEstaNaLista recebe como informação o número que queremos verificar e a lista de números na qual devemos ver se ele está dentro ou não. Lembra que a listaDeSegregos é uma variável local e só pode ser acessada dentro da função sorteiaNumeros? Por isso precisamos passar ela por parâmetro para essa função.

Mas então como sabemos se um número está dentro da lista ou não? Precisamos percorrer a lista inteira e verificar item a item se o número que queremos adicionar é igual ao número salvo naquela posição da lista. Caso ele seja igual nós já sabemos que ele é um número repetido então retornamos falso já que queremos saber se esse número NaoEstaNaLista. Como um retorno para a execução da função no momento que ele é chamado não precisamos nos preocupar com o resto da lista. Mas caso nós tenhamos terminado de percorrer a lista e não retornamos nada, então sabemos que não foi achado nenhum número igual e por isso retornamos verdadeiro ou seja, o número não está na lista.

function NaoEstaNaLista(numero, lista){
    for(var posicao = 0; posicao < lista.length; posicao++) { 
        if(lista[posicao] == numero){
                          return false;
        }
    }
    return true;
}

A função sorteia foi feita em aula, e o que ela faz é pedir um número aleatório para o computador e multiplica esse número por 10, isso porque esse número aleatório que recebemos é sempre algo entro 0 e 1. Depois arrendondamos esse número porque não queremos trabalhar com casas decimais.

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

Espero ter ajudado! Qualquer dúvida manda aqui de novo :)