使用 setInterval 时如何防止出现重复的随机数? (javascript)

How do I prevent a duplicate random number when using setInterval? (javascript)

我一直想通过一个函数生成随机数,然后用setInterval重复那个函数,每次都给我一个新的数字。

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.

还使用节点,因此分号可能会丢失。

当您使用 prevNum 作为 setInterval() 参数时,您总是将变量的原始值传递给回调函数。您应该直接使用全局变量而不是将其作为参数传递。

你也打错了,randColor应该是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)

没有使用回调函数的return值,所以return prevNum;没有意义。而且您不应该将 setInterval() 的结果分配给您的数字变量——它 return 是一个计时器 ID,而不是函数的值。

您可以创建一个 returns 迭代器并保持状态的函数:

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;
}

以上版本以最大数量为参数。像这样使用它:

const p12 = randiter(12);

for (let i=0; i<20; i++) {
    console.log(p12());
}

setInterval(() => console.log(p12()), 1000);

我是那3%
(我想念帕斯卡)

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)