Randomize setInterval (Как переписать тот же случайный после случайного интервала)
Я хотел бы знать, как достичь: генерировать случайное число после случайного числа времени. И использовать это снова.
function doSomething(){
// ... do something.....
}
var rand = 300; // initial rand time
i = setinterval(function(){
doSomething();
rand = Math.round(Math.random()*(3000-500))+500; // generate new time (between 3sec and 500"s)
}, rand);
И делать это неоднократно.
До сих пор мне удавалось генерировать случайный интервал, но он продолжался до тех пор, пока страница не была обновлена (генерируя другой интервал времени).
Спасибо
6 ответов
Вот действительно чистый и понятный способ сделать это:
http://jsfiddle.net/Akkuma/9GyyA/
function doSomething() {}
(function loop() {
var rand = Math.round(Math.random() * (3000 - 500)) + 500;
setTimeout(function() {
doSomething();
loop();
}, rand);
}());
РЕДАКТИРОВАТЬ:
Объяснение: цикл существует только в контексте непосредственно вызванной функции, поэтому он может рекурсивно вызывать себя.
Вот многоразовая версия, которую можно очистить. С открытым исходным кодом в виде пакета NPM с включенной функцией IntelliSense.
Вспомогательная функция
const setRandomInterval = (intervalFunction, minDelay, maxDelay) => {
let timeout;
const runInterval = () => {
const timeoutFunction = () => {
intervalFunction();
runInterval();
};
const delay = Math.floor(Math.random() * (maxDelay - minDelay + 1)) + minDelay;
timeout = setTimeout(timeoutFunction, delay);
};
runInterval();
return {
clear() { clearTimeout(timeout) },
};
};
Применение
const interval = setRandomInterval(() => console.log('Hello World!'), 1000, 5000);
// // Clear when needed.
// interval.clear();
Как то так должно работать - пользуйся setTimeout()
вместо этого вы можете каждый раз устанавливать новое случайное значение:
function doSomething() {
alert("doing something");
}
function init() {
var myFunction = function() {
doSomething();
var rand = Math.round(Math.random() * (3000 - 500)) + 500; // generate new time (between 3sec and 500"s)
setTimeout(myFunction, rand);
}
myFunction();
}
$(function() {
init();
});
Просто установите интервал каждый раз, когда вы ранд (и сначала очистите его)
function doSomething(){
// ... do something.....
}
var i;
var rand = 300;
function randomize() {
doSomething();
rand = Math.round(Math.random()*(3000-500))+500;
clearInterval(i);
i = setInterval('randomize();', rand);
}
i = setInterval('randomize();', rand);
или попробуйте использовать setTimeout (и снова установить после рандинга)
Просто бросаю мою шляпу в кольцо
var keepLooping = true;
(function ontimeout(){
if(keepLooping){
doTheAction();
setTimeout(ontimeout, Math.random() * 100);
}
})();
зависит, если вы хотите поставить doTheAction()
внутри setTimeout
обратный звонок или нет. Я думаю, что это хорошо, чтобы положить его до / снаружи. Если вы хотите начальную задержку, то поместите ее внутрь, если нет, то для простоты поместите ее снаружи.
Я использую это:
function setRandomInterval(intervalFunction, minDelay, maxDelay) {
let outerFunction = () => {
let delay = Math.floor(Math.random() * (maxDelay - minDelay + 1)) + minDelay;
let timeout = setTimeout(outerFunction, delay)
intervalFunction(timeout)
}
outerFunction()
}
Использование:
let start = performance.now()
let i = 1
setRandomInterval((timeout) => {
let end = performance.now()
console.log("Run count", i)
console.log("Random time elapsed", (end - start) / 1000)
start = end
i++
if (i > 5) {
clearTimeout(timeout)
}
}, 500, 5000)