Javascript:生成范围内的随机数,避免前两个

时间:2012-06-24 09:32:10

标签: javascript random

我正在创建一个包含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()在加载时执行,则第一个(欢迎)幻灯片无法显示。

2 个答案:

答案 0 :(得分:4)

在您更改prev1 = rand的值后第二次执行rand时,您将幻灯片的号码分配给它。下次进入循环时,您执行prev2 = prev1,自prev1 == rand起,这意味着现在所有三个变量prev1prev2rand都相同。只需删除第二个prev1 = rand

另一个问题是您将间隔设置两次:首先调用firstSlide(),在延迟5秒(设置一个间隔)后执行randomSlide(),然后在调用randomSlide()后立即调用{{1}}再次设置另一个间隔。

答案 1 :(得分:0)

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

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

前两次迭代不完全随机,但您可以通过在初始化时随机化数组来解决这个问题。但是幻灯片放映可能无关紧要。

代码较少,但拼接部分在我测试的浏览器中速度较慢。我的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;
  }
}());