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

Рабочая jsFiddle здесь.

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

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)
Другие вопросы по тегам