I’m creating a slider with 6 slides, and I want to randomly move between them, making sure that neither of the previous two slides are shown as the next slide. The functionality doesn’t really matter, since what I’m really doing is generating random numbers and keeping track of the previous two. The first slide is always numbered 1, so for the first two iterations that’ll be one of the previous numbers that can’t be used.
Here’s what I have so far, and it works fine for generating the random numbers in the range, but ‘caching’ the last two values doesn’t work reliably:
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();
It’s quite simple I think but my brain’s getting frazzled trying to parse the values of the two ‘cache’ variables at the first, and then each subsequent, iteration.
I’m executing a single iteration at the beginning because if randomSlide() executes on load then the first (welcome) slide doesn’t get a chance to display.
When you do the
prev1 = randthe second time after you’ve changed the value ofrand, you’re assigning the new slide’s number to it. The next time you enter the loop you doprev2 = prev1, and sinceprev1 == randit means that now all three variablesprev1,prev2andrandare the same. Just remove the secondprev1 = rand.Another issue is that you set the interval twice: first you call
firstSlide()which executesrandomSlide()after a 5 second delay (which sets one interval), then right after you callrandomSlide()again which sets another interval.