【问题标题】:Javascript: generate random numbers in range, avoiding previous twoJavascript:生成范围内的随机数,避免前两个
【发布时间】:2012-06-24 09:32:10
【问题描述】:

我正在创建一个包含 6 张幻灯片的滑块,我想在它们之间随机移动,确保前两张幻灯片都不会显示为下一张幻灯片。功能并不重要,因为我真正要做的是生成随机数并跟踪前两个。第一张幻灯片的编号始终为 1,因此对于前两次迭代,这将是之前无法使用的编号之一。

这是我到目前为止所拥有的,它可以很好地生成范围内的随机数,但是“缓存”最后两个值不能可靠地工作:

        var rand = Math.floor(Math.random() * 6) + 1;
        var prev1 = 1;
        var prev2;

        function randomSlide() {
            // 5 second interval between slides
            // Don't show either of previous two slides next
            random = setInterval(function() {
                prev2 = prev1;
                prev1 = rand;

                do {
                    rand = Math.floor(Math.random() * 6) + 1;
                } while (rand == prev1 || rand == prev2);

                prev1 = rand;

                $('#slider').anythingSlider(rand);

                //console.log(prev1,prev2);


            }, 5000);
        }
        function firstSlide() {
            firstTime = setTimeout(function() {
                randomSlide();
            }, 5000);
        }

        firstSlide();            
        randomSlide();

我认为这很简单,但我的大脑在尝试解析两个“缓存”变量的值时感到疲倦,首先是解析两个“缓存”变量的值,然后是每个后续的迭代。

我在开始时执行单次迭代,因为如果 randomSlide() 在加载时执行,则第一张(欢迎)幻灯片没有机会显示。

【问题讨论】:

    标签: javascript random


    【解决方案1】:

    当您在更改rand 的值后第二次执行prev1 = rand 时,您正在为其分配 幻灯片的编号。下次你进入循环时你会做prev2 = prev1,因为prev1 == rand这意味着现在所有三个变量prev1prev2rand都是一样的。只需删除第二个prev1 = rand

    另一个问题是您设置了两次间隔:首先调用firstSlide(),它在5 秒延迟(设置一个间隔)后执行randomSlide(),然后在您再次调用randomSlide() 之后设置另一个间隔。

    【讨论】:

    • 你是对的,randomSlide() 的初始触发似乎不再需要了。出于兴趣,设置两个间隔有什么影响?每次经过 5000 毫秒时,我是否有效地同时调用了 randomSlide() 两次?
    【解决方案2】:

    这是获得结果的另一种(更简单?)方法:

    <script>
    
    // Return a random number from 1 to 6, exclude 
    // the last two numbers.
    var getRandom = (function() {
      var a = [1,2,3,4,5,6];
    
      return function() {
        var i = (Math.random() * 4 ) | 0;
        a[5] = a.splice(i,1);
        return a[5];
      }
    }());
    
    function writeRandom() {
      document.getElementById('d0').innerHTML += getRandom() + '<br>';
    }
    
    setInterval(writeRandom, 100)
    </script>
    
    <div id="d0"></div>
    

    前 2 次迭代不是完全随机的,但您可以通过在初始化数组时随机化来解决这个问题。但对于幻灯片放映来说,这可能并不重要。

    它的代码更少,但拼接部分在我测试的浏览器中让它变慢了。我的 OP 版本是:

    var getRandom2 = (function() {
      var r0 = r1 = r2 = 1;
    
      return function() {
        r0 = r1;
        r1 = r2;
    
        do {
          r2 = Math.floor(Math.random() * 6) + 1;
        } while (r2 == r0 || r2 == r1);
    
        return r1;
      }
    }());
    

    【讨论】:

      猜你喜欢
      • 2010-12-24
      • 2013-08-16
      • 1970-01-01
      • 2018-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-01
      相关资源
      最近更新 更多