0

我正在创建一个包含 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() 在加载时执行,那么第一张(欢迎)幻灯片没有机会显示。

4

2 回答 2

4

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

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

于 2012-06-24T09:36:21.447 回答
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>

前 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;
  }
}());
于 2012-06-24T10:42:05.260 回答