He querido generar números aleatorios a través de una función y luego usar setInterval para repetir esa función y darme un número nuevo cada vez.
function randNum(prevNum) { let randNum = Math.round(Math.random() * 12) //choose a number between 0 and 12 while (randNum == prevNum){ //if the chosen number is the same as prevNum, choose another random number randColor = Math.round(Math.random() * 12) } prevNum = randColor //assign current value to parameter return (prevNum); //return parameter } prevNum = 0, prevNum = setInterval (randNum, 1000, prevNum) //assign returned parameter to current variable, then go back into the function with the new parameter value.también usando el nodo, por lo que es posible que falten puntos y comas.
Cuando usa prevNum como un argumento setInterval() , siempre está pasando el valor original de la variable a la función de devolución de llamada. Solo debe usar la variable global directamente en lugar de pasarla como parámetro.
También tiene un error tipográfico, randColor debe ser randNum .
let prevNum = 0; function randNum() { let newNum while (true) { newNum = Math.round(Math.random() * 12) //choose a number between 0 and 12 if (newNum != prevNum) { break; } } prevNum = newNum //save the current value console.log(prevNum); } let interval = setInterval(randNum, 1000) El valor de retorno de la función de devolución de llamada no se usa, por lo que no tiene sentido return prevNum; . Y no debe asignar el resultado de setInterval() a su variable numérica: devuelve una ID de temporizador, no el valor de la función.
Podría crear una función que devuelva un iterador y mantenga el estado:
function randiter(n) { let num = 0; const iter = () => { let cur; do { cur = Math.round(Math.random() * n); } while (cur === num); num = cur; return num; }; return iter; }La versión anterior toma el número máximo como parámetro. Úsalo así:
const p12 = randiter(12); for (let i=0; i<20; i++) { console.log(p12()); }o
setInterval(() => console.log(p12()), 1000);yo soy el 3%
(y echo de menos a Pascal)
let intervalRef = setInterval( ( prev ) => { let newNum; do newNum = Math.round(Math.random() * 12) while( newNum === prev.val ) prev.val = newNum console.log( newNum ) } , 1000, { val: null } ) setTimeout(()=>clearInterval(intervalRef), 20000)