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

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 Here is a really clean and clear way to do it:

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

``````function doSomething() {}

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

EDIT:

Explanation: loop only exists within the immediately invoked function context, so it can recursively call itself. Something like this should work - use `setTimeout()` instead so you can set a new random value each time:

``````function doSomething() {
}

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();
});
`````` Just setup interval each time you rand (and clear it first)

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

or try using setTimeout (and setting again after randing) Just throwing my hat in the ring

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

depends if you want to put `doTheAction()` inside the `setTimeout` callback or not. I think it's fine to put it before/outside. If you want the initial delay, then put it inside, if not, put it outside for simplicity. 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();
``````