【问题标题】:Randomize setInterval ( How to rewrite same random after random interval)随机化 setInterval(如何在随机间隔后重写相同的随机数)
【发布时间】:2011-08-05 21:06:49
【问题描述】:

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

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

然后反复做。

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

谢谢

【问题讨论】:

    标签: javascript jquery


    【解决方案1】:

    这是一个非常干净明了的方法:

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

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

    编辑:

    说明: 循环只存在于立即调用的函数上下文中,所以它可以递归调用自己。

    【讨论】:

    • 不错的解决方案,但如果您希望能够在一段时间内删除“间隔”,则需要进行一些更改。
    • @toprightgamedev 如果您想停止循环,只需使用您需要的逻辑在 setTimeout 周围放置一个 if 语句。
    • 很抱歉这么多年后才找到这个答案,但我有一个问题:你不会有一堆执行上下文随着这个解决方案不断增加吗?
    • 我找到了一个很好的解释,说明它为什么不创建执行上下文堆栈:stackoverflow.com/a/13506904/1951430
    • @jobou 它确实堆栈执行上下文。你是对的。
    【解决方案2】:

    这是一个可重复使用的版本,可以清除。已启用 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();
    

    【讨论】:

    • 干净简单的解决方案
    【解决方案3】:

    这样的东西应该可以工作 - 请改用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.

    【讨论】:

    • @roXon:是的——这样你每次都可以更新随机间隔
    • 最后是 jQuery,而不是普通的 Javascript。
    • 如何用这个方法传递参数?
    【解决方案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(并在排序后再次设置)

    【讨论】:

    • 附带说明应该是setInterval(randomize, rand);
    【解决方案5】:

    只是把我的帽子扔进擂台

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

    取决于您是否要将doTheAction() 放入setTimeout 回调中。我认为把它放在前面/外面很好。如果您想要初始延迟,则将其放入内部,如果没有,则将其置于外部。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-24
      • 2011-01-27
      相关资源
      最近更新 更多