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

[Duda] HOLA! Tengo una duda al actializar la condicional de mi ciclo While.

Hice este adivinador de numero de la suerte para probar el While pero no entiendo porque al actualizar mi condición debo poner guess = Math.floor(Math.random(1,10)10); y no guess = luckyNumber, si al final quiero que se detenga cuando llegue a 7. Gracias por leer. :)

const luckyNumber = 7; 
let guess = Math.floor(Math.random(1,10)*10); 
while (guess != luckyNumber){
  console.log(`Incorrect number, It is not ${guess}. TRY AGAIN`);
  guess = Math.floor(Math.random(1,10)*10);
} console.log(`My lucky number is ${luckyNumber}`);
1 respuesta

Hola Jair, si tú relizaste el código cómo es que no sabes el funcionamiento del mismo? Está bien tomar el código de otro lado y también está bien tener dudas en un código que no es tuyo, así se aprende! Respecto a tu duda y revisando el código, lo que hace el código es "adivinar" el número luckyNumber de forma automática.

El primer error es la línea:

let guess = Math.floor(Math.random(1,10)*10);

En específico la llamada a Math.random, ya que de acuerdo a la documentación, esta función no recibe parámetros, por lo que lo correcto sería let guess = Math.floor(Math.random() * 10); . Math.random() te retorna un valor aleatorio entre 0 (inclusivo) y 1 (exclusivo), por lo que el número máximo que puedes obtener nunca llegará a ser 1. La multiplicación se hace simplemente para convertir ese número decimal a base 10. Y Math.floor() redondea ese valor hacia abajo o hacia "piso".

Ya aclarado el punto anterior, lo que mencionas es correcto y no, ya que si hicieras la modificación que propones, el programa se detendría inmediatamente, puesto que que al hacer guess = luckyNumber la condición de que sean distintos se deja de cumplir y el bucle while se termina. Es correcto si quisieras que ese sea el comportamiento. Si quisieras que el programa adivine por sí mismo, entonces lo que mencionas es incorrecto ya que tú le estás proporcinando la respuesta.

Otro error es que si cambiaras el valor de luckyNumber a 10, el programa quedaría un un bucle infinito ya que recordemos que el número generado por Math.random() se genera entre 0 (inclusivo) 1 (exclusivo). Lo que quiere decir que nunca podrías obtener un 1, o en este caso, un valor de 10 (por la multiplicación de 10). Tomando los ejemplos de Math.random(), para generar un número entre dos rangos, ambos inclusivos, debes de hacer lo siguiente:

Math.floor(Math.random() * (max - min + 1) + min); // The maximum is inclusive and the minimum is inclusive

Una versión mejorada sería la siguiente, agregando el número de intentos que le tomó al programa adivinar el número oculto en luckNumber y corriginedo el problema de los números generados aleatoriamente.

let luckyNumber = 11; // Número secreto a adivinar
// const luckyNumber = prompt("Provide a number:"); // Opcionalment podrías requerir este número desde un prpmt en lugar de definirlo en código
let min =  0; // Número minimo para generar aleatoriamente
let max = luckyNumber; // Número máximo para generar aleatoriamente. Aquí es igual a luckNumber puesto que queremos números entre 0 y luckyNumber, 11 en este caso.
let guess =  Math.floor(Math.random() * (max - min + 1) + min); // Generar un número aleatorio entre 0 y luckyNumber
let tries = 1; // Iniciar el contador de intentos
while (guess != luckyNumber) { // Mientras el número aleatorio (guess) sea distinto de luckNumber, ejecutar el código
  console.log(`Incorrect number, it is not ${guess}. TRYING AGAIN.`); // Mostrar el número aleatorio generado
  guess =  Math.floor(Math.random() * (max - min + 1) + min); // Generar un número aleatorio entre 0 y luckyNumber
  tries = tries + 1; // Incrementar el número de intentos
}

// Cuando la condición se rompa, mostrar el número secreto y el número de intentos que le tomó a la computadora adivinarlo
console.log(`The lucky number is ${luckyNumber} and it took ${tries} ${tries == 1 ? 'try' : 'tries'} to guess it.`);