2015-02-18 45 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)); 
}