Randomize setInterval ( How to rewrite same random after random interval)

Viewed 57442

I'd like to know how to achieve: generate a random number after a random number of time. And reuse it.

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

And do it repeatedly.

So far I was able to generate a random interval, but it last the same until the page was refreshed (generating than a different time- interval).

Thanks

5 Answers

Here's a reusable version that can be cleared. Open-sourced as an NPM package with IntelliSense enabled.

Utility Function

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

Usage

const interval = setRandomInterval(() => console.log('Hello World!'), 1000, 5000);

// // Clear when needed.
// interval.clear();
Related