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

[Duvida para evitar a repetição de números]

O que não ficou tão claro para mim foi a parte do código para evitar a repetição de números. Alguém poderia me ajudar?

3 respostas

exatamente a mesma dúvida que a minha Natalia.

solução!

Olá Natalia, consegui entender. Vou tentar explicar por aqui. Vamos olhar linha por linha o que o código está processando:

//funcao sorteia: sorteia um numero aleatório entre 1 e 10
function sorteia () {
        return Math.round (Math.random()*10);
}

Esse numero fica gravado, pq ainda a função não foi chamada no código. Vamos entender a próxima função em partes, pq ela é bem longa. Lembrando que, a função sorteiaNumeros (quantidade) será a responsável por:

  • gerar a quantidade definida para o Array (no nosso código é 3) com números aleatórios;
  • desconsiderar o número 0 e;
  • não repetir números já presentes na lista de segredos.
    function sorteiaNumeros (quantidade) {  \\quantidade é 3
          var segredos = []; //declara a variável segredos recebendo vazio
          var numero = 1;  //declara variável número recebendo 1 para evitar o loop infinito
    Então, entro no while dentro da function sorteiaNumeros:
    while (numero <= quantidade) { // 1 < = 3 ok
          var numeroAleatorio = sorteia (); \\ vamos supor que sorteou segredo nº 5
          var achou = false;
    Continuando o código:
if (numeroAleatorio !== 0) { //como 5 é diferente de 0 entro no for

Dentro do for a posicao é igual a 0 e segredos foi declarado como vazio lá em cima, certo? então aqui nessa 1ª rodada posicao é igual a 0 e segredos.lenght igual a 0 também certo? então não satisfaz a condição do for, então já saio dele.

for (var posicao=0; posicao < segredos.length; posicao++) {
    if (segredos [posicao] == numeroAleatorio) {
        achou = true;
        break;
    }
}

Quando saio dele caio no if, achou==false essa condição foi satisfeita, insiro dentro do meu array o número 5 do meu exemplo (como número aleatório sorteado) e incremento +1 à variável número.

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

Agora vamos para a 2ª rodada para ser possível compreender:

function sorteiaNumeros (quantidade) {
    var segredos = [ ]; // agora não é mais vazio, pois foi inserido o número [5, ?, ? ]
    var numero = 1; //agora var numero = 2

Então entro no while dentro da function sorteiaNumeros:

while (numero <= quantidade) { // 2 <= 3 ok
    var numeroAleatorio = sorteia (); // vamos supor que agora sorteou o segredo nº 2
    var achou = false;

Continuando o código:

if (numeroAleatorio !== 0) {  // como 2 é diferente de 0 entro no for

Dentro do for, a posicao é igual a 0 e segredos.lenght agora é 1 (pq já tenho o numero 5 lá dentro). Então desta vez satisfaz a condição do for, então permaneço nele.

for (var posicao=0; posicao < segredos.length; posicao++) {
        if (segredos [posicao] == numeroAleatorio) {//segredos [0] --> 5 == 2, NÃO.
            achou = true;
            break;
        }
}

Como não satisfez a condição do if e não tenho mais como continuar no for, saio dele. Caio no if, achou==false essa condição foi satisfeita, insiro dentro do meu array desta vez o segredo numero 2 do meu exemplo (como número aleatório sorteado) e incremeto +1 à variável número.

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

Agora a 3ª rodada para entender a questão da repetição:

function sorteiaNumeros (quantidade) { //quantidade = 3
    var segredos = [ ]; // agora temos dois números no array, pois foram inseridos os números [5, 2, ? ]
    var numero = 1; //agora var numero = 3

Entro no while dentro da function sorteiaNumeros:

while (numero <= quantidade) { // 3 <= 3 ok
        var numeroAleatorio = sorteia (); \\ vamos supor que agora sorteou o segredo nº 2 novamente.
        var achou = false;

Continuando o código:

if (numeroAleatorio !== 0) { //como 2 é diferente de 0 entro no for

Dentro do for a posicao é igual a 0 e segredos.lenght agora é 2 (pq já tenho o numero 5 e 2 lá dentro)logo satisfaz a condição do for, então permaneço nele.

for (var posicao=0; posicao < segredos.length; posicao++) {
        if (segredos [posicao] == numeroAleatorio) { //segredos [0] --> 5 == 2, NÃO.
            achou = true;
            break;
        }
}

Desta vez continuo no for, pois foi incrementado +1 na posição e continua atendendo a condição posicao < segredos.length (1<2).

for (var posicao=0; posicao < segredos.length; posicao++) {
    if (segredos [posicao] == numeroAleatorio) { //segredos [1] --> 2 == 2, SIM.
        achou = true;
        break;
    }
}

Como dessa vez o número sorteado foi igual ao segredo da posição, saio do for. Caio no if, achou==false essa condição desta vez não é satisfeita, então dessa vez não insiro nada dentro do meu array e nem incremento +1 à variável número. Ela continuará como 3 e reinicio o processo com um novo nº aleatório.

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

Espero que apesar da resposta longa tenha dado para entender. Se não ficou claro algum passo, me avise. Abraços!

Rafaela, muito obrigado pela resposta! Graças a ela, consegui solucionar o problema de repetição dos números no meu programa.