2012-06-24 164 views
0

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

这里是我迄今为止,它在范围内产生随机数的正常工作,但“缓存”的最后两个值不正常:

 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

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

的另一个问题是,你设置的时间间隔两次:第一次调用firstSlide()其延迟5秒后执行randomSlide()(设置一个间隔),你再打电话randomSlide()后,然后用鼠标右键这台另一间隔。

+0

你说得对,randomSlide()的初始触发似乎不再需要。出于兴趣,设置两个时间间隔有什么影响?每次5000ms通过时,我是否同时有效地调用randomSlide()两次? – melat0nin

+1

是的,就是这样。 – JJJ

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; 
    } 
}()); 
相关问题