Estoy trabajando en un juego de adivinanzas de números aleatorios en JavaScript. Quiero que el usuario ingrese un límite bajo y un límite alto y que se genere el número aleatorio entre esos dos números. Intenté codificar lowLimit y highLimit como se muestra a continuación:
let lowLimit = 5; let highLimit = 20; let random = Math.floor(Math.random() * highLimit); if (random < lowLimit) { random += lowLimit; } console.log(random);y todo funciona bien.
Sin embargo, cuando permito que el usuario ingrese valores, el número aleatorio siempre se convierte en la suma de lowLimit y upperLimit. ¡No puedo entender esto!
Mi código final es este:
let lowLimit = prompt('Input the lower limit:'); let highLimit = prompt('Input the upper limit:'); let random = Math.floor(Math.random() * highLimit); let tries = 0; if (random < lowLimit) { random += lowLimit; } console.log(random); let guess = prompt('Secret number generated. Enter guess:'); while (guess !== random) { if (guess === 'q') break; tries += 1; if (guess > random) { prompt('You guessed too high. Guess again...'); } else if (guess < random) { prompt('You guessed too low. Guess again...'); } else { alert('You guessed correctly! You made ' + tries + " guesses."); } }Esta solución funciona. Cualquier sugerencia de refactorización es bienvenida.
let lowLimit = Number(prompt('Input the lower limit:')); let highLimit = Number(prompt('Input the upper limit:')); while (!lowLimit || !highLimit) { lowLimit = Number(prompt('Input a valid lower limit:')); highLimit = Number(prompt('Input a valid upper limit:')); } lowLimit = Number(lowLimit); highLimit = Number(highLimit); let random = Math.floor(Math.random() * (highLimit - lowLimit) + lowLimit); let guesses = 0; console.log(random); guess = prompt('Enter guess:'); while (guess !== random) { if (guess === 'q') { alert('Ok. Quitting... You made ' + guesses + ' guesses') break; } guesses += 1; guess = Number(guess); if (guess > random) { guess = prompt('You guessed too high. Guess again...'); } else if (guess < random) { guess = prompt('You guessed too low. Guess again...'); } else alert('You guessed correctly! You made ' + guesses + " guesses."); }Algunos ajustes para mejorar el código y una corrección de errores (en el caso de que el usuario adivine correctamente en el primer intento, no recibirá comentarios)...
// + is concise way to coerce an int const lowLimit = +prompt('Input the lower limit:'); const highLimit = +prompt('Input the upper limit:'); // note - we could add checks here for invalid or disordered values // this presumes we want random to be exclusive of highLimit. if not, we'll need to tweak const random = Math.floor(Math.random() * (highLimit - lowLimit) + lowLimit); // we'll vary the prompt during the game let promptMsg = 'Enter guess:', guesses = 0, guess; // bug fix and cleanup: do while, so we always play at least once // prompt in just one place, alter the prompt message to represent game state do { guess = prompt(promptMsg); guesses++; if (guess !== 'q') { guess = +guess; if (guess > random) { promptMsg = 'You guessed too high. Guess again...'; } else if (guess < random) { promptMsg = 'You guessed too low. Guess again...'; } } } while (guess !== 'q' && guess !== random); const endMsg = guess === 'q' ? 'Ok. Quitting' : 'You guessed correctly.' const guessesMsg = `You made ${guesses} ${guesses === 1 ? 'guess' : 'guesses'}`; alert(`${endMsg} ${guessesMsg}`)Podemos generar un número aleatorio usando Date.now()
let res = Date.now() % (highLimit - lowLimit + 1) + lowLimit.
Esto se debe a que nadie puede estimar el tiempo en milisegundos que se ejecuta el código.