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);
И делайте это повторно.
До сих пор мне удалось генерировать случайный интервал, но он оставался таким же, пока страница не была обновлена (генерируется, чем другой временной интервал).
Спасибо
Ответы
Ответ 1
Вот действительно чистый и понятный способ сделать это:
http://jsfiddle.net/Akkuma/9GyyA/
function doSomething() {}
(function loop() {
var rand = Math.round(Math.random() * (3000 - 500)) + 500;
setTimeout(function() {
doSomething();
loop();
}, rand);
}());
EDIT:
Объяснение:
цикл существует только в контексте контекстно-зависимой функции, поэтому он может рекурсивно называть себя.
Ответ 2
Что-то вроде этого должно работать - используйте 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();
});
Работает jsFiddle здесь.
Ответ 3
Просто установите интервал каждый раз, когда вы rand (и сначала очистите его)
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 (и снова установить после рандинга)
Ответ 4
Просто бросаю шляпу в кольцо
var keepLooping = true;
(function ontimeout(){
if(keepLooping){
doTheAction();
setTimeout(ontimeout, Math.random() * 100);
}
})();
зависит, если вы хотите поместить doTheAction()
в обратный вызов setTimeout
или нет. Я думаю, что это нормально, чтобы поставить его перед/снаружи. Если вам нужна начальная задержка, тогда поместите ее внутрь, если нет, поместите ее наружу для простоты.