2012-06-24 160 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; 
    } 
}()); 
相關問題