2015-02-18 125 views
0

我有一副撲克牌對象,基本上只是用0-51(52張牌)填充一個牌組,然後洗牌。我有一個cards.deal()方法返回一張卡片。當我使用cards.pop()時,我總是得到不同的數字,這是預期的;然而,當我使用cards.shift()時,它總是返回0.我滿足於使用流行音樂,但只是爲了學習目的而瞭解,爲什麼我在使用shift時總是得到0。我已經將洗牌的數量改爲10000這樣的龐大數字,以確保它足夠混洗,以實際交換陣列中的第一個元素。即使在0和51之間生成了10,000個隨機數後,Math.ceil方法是否可能不會返回0?這裏發生了什麼?Javascript shift()總是返回0

function Deck(){ 

    var cards = []; 

    this.shuffle = function(){ 

     var tempCardHolder = 0; 
     var randomNumber = 0; 
     var randomNumber2 = 0; 

     // fill the card array with 52 cards 
     for (x = 0; x <= 51; x++){ 
      cards[x] = x; 
     } 


     // now let's shuffle them up by swapping two cards randomly 50 times 
     for (y = 0; y < 100; y++){ 

      // make sure we get two random numbers that are different 
      do { 
       randomNumber = Math.ceil(Math.random() * 51); 
       randomNumber2 = Math.ceil(Math.random() * 51); 
      } while (randomNumber == randomNumber2); 

      tempCardHolder = cards[randomNumber]; 
      cards[randomNumber] = cards[randomNumber2]; 
      cards[randomNumber2] = tempCardHolder; 

     } 

    } 

    this.deal = function(){ 
     return cards.shift(); 
    } 

    this.getNumCardsLeft = function(){ 
     return cards.length; 
    } 

} 
+3

'Math.ceil(x)的'只會給' 0',如果'-1 2015-02-18 00:47:57

+0

啊,這種類型是不可能的我正在計算的東西。那麼有沒有更好的方法來獲得0-51之間的隨機數? – 2015-02-18 00:50:10

+1

你應該使用'Math.floor(Math.random()* 52)' – Bergi 2015-02-18 00:52:35

回答

0

使用Math.floor四捨五入您的數字。對於所包括的範圍,一定要乘比所需的最大值

這裏較大的一個是包容性的終點

一個隨機整數生成器的例子
function random_int(max, min) { 
    min = min || 0; 
    return min + Math.floor(Math.random() * (max - min + 1)); 
}