使用 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)
我一直想通过一个函数生成随机数,然后用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)