Randomize setInterval (Как переписать тот же случайный после случайного интервала) - PullRequest
34 голосов
/ 06 августа 2011

Я хотел бы знать, как достичь: генерировать случайное число после случайного числа времени. И использовать его снова.

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

И делайте это многократно.

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

Спасибо

Ответы [ 4 ]

82 голосов
/ 06 августа 2011

Вот действительно чистый и понятный способ сделать это:

http://jsfiddle.net/Akkuma/9GyyA/

function doSomething() {}

(function loop() {
    var rand = Math.round(Math.random() * (3000 - 500)) + 500;
    setTimeout(function() {
            doSomething();
            loop();  
    }, rand);
}());

РЕДАКТИРОВАТЬ:

Объяснение: циклсуществует только в контексте непосредственно вызываемой функции, поэтому он может рекурсивно вызывать себя.

5 голосов
/ 06 августа 2011

Как-то так должно работать - вместо этого используйте 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 .

4 голосов
/ 06 августа 2011

Просто установите интервал каждый раз, когда вы будете рандировать (и сначала очистите его)

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 (и снова настройте после ранда)

1 голос
/ 03 ноября 2016

Просто бросаю шляпу в кольцо

    var keepLooping = true;
    (function ontimeout(){
        if(keepLooping){
            doTheAction();
            setTimeout(ontimeout, Math.random() * 100);
        }
    })();

зависит от того, хотите ли вы поместить doTheAction() в setTimeout обратный вызов или нет. Я думаю, что это хорошо, чтобы положить его до / снаружи. Если вы хотите начальную задержку, поместите ее внутрь, если нет, то для простоты выведите ее наружу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...