Solucionado (ver solución)
Solucionado
(ver solución)
2
respuestas

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.

2 respuestas
solución!

Hola Edward,

La iteración del for es ejecutada completamente en cada ejecución del While, es decir en cada validación de cada numeroAleatorio hay una iteración completa donde tu variable i es inicializada en 0.

voy a explicarlo mejor con tu propio ejemplo y simulando con cantidad de números aleatórios = 4:

// primera vuelta del while contador = 1 AND primera vuelta i = 0
    numeroAleatorio = 3;
    secretosUno.lenght = 0;
    i < 0 // no entra al for
    secretosUno = [3] // solo tiene un elemento qué  seria igual decir secretosUno[0] = 3;

 // segunda vuelta del while contador = 2 AND nuevamente el  i =0 -- el iterador i vuelve 0
    numeroAleatorio = 5;
    secretosUno.length = 1; //el tamaño del array es 1 
    i < 1 // entra al for solo 1 iteración
    secretosUno[0] = 3;  
    numeroAleatorio == secretosUno[0] // el resultado aquí es false
    secretosUno = [3, 5] // ahora el array tiene dos elementos, y sería igual decir secretosUno[0] = 3 y secretosUno[1] = 5

    // tercera vuelta del while contador = 3 AND nuevamente el i =0 -- el iterador i vuelve 0
    numeroAleatorio = 6;
    secretosUno[0] = 3;
    secretosUno[1] = 5;
    secretosUno.length = 2; //el tamaño del array es 2 
    i < 2  // entra al for 2 iteraciones
    numeroAleatorio == secretosUno[0] // el resultado aquí es false
    numeroAleatorio == secretosUno[1] // el resultado aquí es false
    secretosUno = [3, 5, 6] // ahora el array tiene tres elementos

    // cuarta vuelta del while contador = 4 AND nuevamente el  i =0 -- el iterador i vuelve 0
    numeroAleatorio = 3; // como es aleatorio puede ser cualquier número, incluso uno igual a los anteriores.
    secretosUno[0] = 3;
    secretosUno[1] = 5;
    secretosUno[2] = 6;
    secretosUno.length = 3; //el tamaño del array es 3
    i < 3 = false // entra al for 3 iteraciones
    numeroAleatorio == secretosUno[0] // el resultado aquí es true 3 = 3 
    encontrado = true // corta el ciclo for

    // quinta vuelta del while solo que el contador = 4 AND nuevamente el  i =0 -- el iterador i vuelve 0
    numeroAleatorio = 8;
    secretosUno[0] = 3;
    secretosUno[1] = 5;
    secretosUno[2] = 6;
    secretosUno.length = 3; //el tamaño del array es 3
    numeroAleatorio == secretosUno[0] // el resultado aquí es false
    numeroAleatorio == secretosUno[1] // el resultado aquí es false
    numeroAleatorio == secretosUno[2] // el resultado aquí es false
    secretosUno = [3, 5, 6, 8] // ahora el array tiene 4 elementos,
Si este post te ayudó, por favor, marca como solucionado ✓. Continúa con tus estudios

Hola Profe, Muchas gracias por su respuesta. Ahora me queda todo más claro. Saludos,