随机化setInterval(如何在随机间隔后重写相同的随机数)

时间:2011-08-05 21:06:49

标签: javascript jquery

我想知道如何实现: 在随机数量的时间后生成一个随机数。并重复使用它。

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

反复做。

到目前为止,我能够生成一个随机间隔,但它会持续相同,直到页面被刷新(生成的时间间隔不同)。

由于

5 个答案:

答案 0 :(得分:82)

这是一个非常干净清晰的方法:

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

function doSomething() {}

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

修改

说明: 循环仅存在于立即调用的函数上下文中,因此它可以递归调用自身。

答案 1 :(得分:5)

这样的事情应该有用 - 改为使用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();
});

Working jsFiddle here

答案 2 :(得分:4)

每次弯道时设置间隔(并先清除它)

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(并在randing后再次设置)

答案 3 :(得分:1)

把帽子扔进戒指

doTheAction()

取决于您是否要将setTimeout置于comp回调中。我认为把它放在前/外是没关系的。如果你想要初始延迟,那么把它放在里面,如果没有,为了简单起见,把它放在外面。

答案 4 :(得分:1)

这是一个可重用的版本,可以清除。启用了IntelliSense的开源as an NPM package

实用功能

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