我正在创建一个包含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()在加载时执行,则第一个(欢迎)幻灯片无法显示。
答案 0 :(得分:4)
在您更改prev1 = rand
的值后第二次执行rand
时,您将新幻灯片的号码分配给它。下次进入循环时,您执行prev2 = prev1
,自prev1 == rand
起,这意味着现在所有三个变量prev1
,prev2
和rand
都相同。只需删除第二个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;
}
}());