Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
1
respuesta

Consulta "Juego secreto 3"

Buenas noches, Tengo una consulta sobre el código en el Juego Secreto 3 realizado en clase por el profesor. Mi duda es en la parte del for donde hace la comparación para que no hayan números repetidos en el array.

while(contador <= cantidad) {
            numeroAleatorio = aleatorio();
            console.log(numeroAleatorio);
            var encontrado = false;

            if(numeroAleatorio !== 0) {
                for(var i = 0; i < secretosUno.length; i++) {
                    if(numeroAleatorio === secretosUno[i]) {
                        encontrado = true;
                    }
                }
                if(encontrado === false) {
                    secretosUno.push(numeroAleatorio);
                    contador++;
                }
            }    
        }
        return secretosUno;

Cuándo dice if(numeroAleatorio === secretosUno[i]), el valor de secretosUno en el indice 0 (ya que i primero vale cero) va ser undefined porqué no hay ningún valor en esa posición. En la segunda iteración o recorrido, es decir, cuando i vale 1, el valor también sería undefined porqué no habría ningún valor en esa posición. El array solo tendría un valor que vendría a ser la posición de i cuando vale 0, y así sucesivamente por lo que la comparación para ver si no hay números repetidos estaría mal. Veamos un ejemplo del recorrido del for con valores supuestos:

// primera vuelta i = 0
    numeroAleatorio = 3;
    secretosUno[0] = undefined; // porqué no hay ningun elemento
    numeroAleatorio == secretosUno[0] // el resultado aquí seria false
    secretosUno = [3] // solo tiene un elemento qué  seria igual decir secretosUno[0] = 3;

    // segunda vuelta i =1
    numeroAleatorio = 5;
    secretosUno[1] = undefined; // porque en esa posición no hay ningún elemento
    numeroAleatorio == secretosUno[1] // el resultado aquí seria false
    secretosUno = [3, 5] // ahora el array tiene dos elementos, y sería igual decir secretosUno[0] = 0 y secretosUno[1] = 5

    // tercera vuelta i = 2
    numeroAleatorio = 6;
    secretosUno[2] = undefined; //porque en esa posición no hay ningún elemento
    numeroAleatorio == secretosUno[2] // el resultado aquí seria false
    secretosUno = [3, 5, 6] // ahora el array tiene tres elementos, y sería igual decir secretosUno[0] = 0; secretosUno[1] = 5 y secretosUno[2] = 6

    // cuarta vuelta i = 3
    numeroAleatorio = 3; // como es aleatorio puede ser cualquier número, incluso uno igual a los anteriores.
    secretosUno[3] = undefined; //porque en esa posición no hay ningún elemento
    numeroAleatorio == secretosUno[3] // el resultado aquí seria false
    secretosUno = [3, 5, 6, 3] // ahora el array tiene 4 elementos, y sería igual decir secretosUno[0] = 0; secretosUno[1] = 5; secretosUno[2] = 6 y secretosUno[3] = 3

Según la lógica que había entendido del recorrido del array, esa comparación para ver que no hayan repetidos estaría mal pero el programa si lo resuelve muy bien y arroja un array sin repetidos. Alguien me podría explicar como funciona el recorrido del array en ese caso? Derrepente me estoy confundiendo y enredándome yo solo. Gracias.

1 respuesta

Hola Edward, el proceso es el siguiente:

function aleatorio() {
    var aleatorio = Math.round(Math.random()* 10);
    return aleatorio;
}

var contador = 1;
var cantidad = 3;
var secretosUno = [];

while(contador <= cantidad) {
        numeroAleatorio = aleatorio();
        console.log(numeroAleatorio);
        var encontrado = false;

        if(numeroAleatorio != 0) {
            //En la primera iteración no ingresa al for ya que no hay nada que iterar, i = 0 y la longitud del array es 0 también, por lo que se irá directo a agregar el item al array por defecto
            for(var i = 0; i < secretosUno.length; i++) {
                if(numeroAleatorio === secretosUno[i]) {
                    encontrado = true;
                }
            }

            if(encontrado == false) {
                secretosUno.push(numeroAleatorio);
                contador++;
            }
        }    
    }