2015-02-18 6 views
0

У меня есть колода карт, которая по существу просто заполняет массив колоды 0-51 (52 карты), а затем перетасовывает карты. У меня есть метод card.deal(), который возвращает карту. Когда я использую cards.pop(), я всегда получаю другое число, что и ожидалось; однако, когда я использовал cards.shift(), он всегда возвращает 0. Я доволен использованием pop, но просто хотел бы понять для учебных целей, почему я всегда получаю 0, когда использую shift. Я изменил количество перетасовки на огромные цифры, например, 10 000, чтобы убедиться, что он перетасовки достаточно, чтобы фактически заменить первый элемент в массиве. Может ли быть возможно, что метод Math.ceil не возвращает 0, даже после 10000 случайных чисел, сгенерированных между 0 и 51? Что здесь происходит?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 (х)' даст только ' 0', если '-1

+0

ах, это добро о том, что я понял. Так есть ли лучший способ получить случайное число между 0-51 включительно? –

+1

Вы должны использовать 'Math.floor (Math.random() * 52)' – Bergi

ответ

0

Используйте Math.floor, чтобы округлить ваши номера. Для инклюзивных диапазонов, убедитесь, что вы умножаете один больше, чем ваш желаемого максимального значения

Вот пример случайного целого числа генератора для инклюзивных конечных точек

function random_int(max, min) { 
    min = min || 0; 
    return min + Math.floor(Math.random() * (max - min + 1)); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^