Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

like image 807
Roko C. Buljan Avatar asked Aug 05 '11 21:08

Roko C. Buljan


People also ask

Does setInterval repeat?

setInterval() The setInterval() method, offered on the Window and Worker interfaces, repeatedly calls a function or executes a code snippet, with a fixed time delay between each call.

Can Math random return 1?

The Math. random() method returns a random number from 0 (inclusive) up to but not including 1 (exclusive).

How many times does setInterval run?

setInterval will run the function sendMessage every second (1000 ms).

How to randomly generate numbers in JavaScript?

Generating Javascript Random Numbers Javascript creates pseudo-random numbers with the function Math. random() . This function takes no parameters and creates a random decimal number between 0 and 1. The returned value may be 0, but it will never be 1.


2 Answers

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.

like image 64
Akkuma Avatar answered Sep 20 '22 13:09

Akkuma


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(); 
like image 43
jabacchetta Avatar answered Sep 17 '22 13:09

jabacchetta