Подтвердить что ты не робот

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

И делайте это повторно.

До сих пор мне удалось генерировать случайный интервал, но он оставался таким же, пока страница не была обновлена ​​(генерируется, чем другой временной интервал).

Спасибо

4b9b3361

Ответ 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 или нет. Я думаю, что это нормально, чтобы поставить его перед/снаружи. Если вам нужна начальная задержка, тогда поместите ее внутрь, если нет, поместите ее наружу для простоты.