2017-02-13 13 views
0

Я работаю над карточной игрой с шестью доступными костюмами, но может быть 2-6 игроков, и мне нужно только, чтобы количество костюмов соответствовало количеству игроки.JS: получить x количество случайных чисел внутри интервала с циклом while

let players = 4  
const suits = [1, 2, 3, 4, 5, 6] 

Конечно, я хочу, чтобы они вышли случайным образом.

я придумал следующее решение:

export function getRandomSuits(nrOfPlayers) { 
    const rangeMin = 1; 
    const rangeMax = 6; 
    const amount = nrOfPlayers; 
    let nums = []; 

    let getRandomNumber = function() { 
     return Math.floor((Math.random() * rangeMax) + rangeMin); 
    } 

    while (nums.length < amount) { 
     let nr = getRandomNumber(); 
     var numberExists = _.indexOf(nums, nr); 
     console.log(numberExists); 
     if(numberExists < 0) { 
      nums.push(nr); 
     } 
    } 

    return nums; 
} 

Это было некоторое время, так как я использовал «в то время как петля» штуковина, так что я не чувствую себя очень комфортно с ним.

Мои вопросы:

  1. Это хорошая практика, или есть лучшее решение?
  2. Есть ли какие-либо результаты или другие практические причины, почему это решение плохое?
  3. Я переусердствую?
+0

Вы не должны определить функцию внутри функции – Hum4n01d

+2

Почему ?, Я видел его во многих местах. – Winter

+2

Ваша техника 'while' - хорошая идея, но количество итераций, которые потребуется для поиска X разных чисел, является случайным. Теоретически это может быть бесконечно, если, например, есть только один доступный костюм, и он продолжает ударять по другим номерам. Вы можете контролировать это, используя временный массив, в котором вы перечисляете все доступные костюмы, и как только вы его выбираете, удалите его из этого массива. Таким образом, вы никогда не ударите один и тот же костюм дважды (более эффективно). – blex

ответ

1
  1. На мой взгляд, я не вижу никакой необходимости в функции getRandomNumber(). Тем не менее, это зависит от предпочтений.
    я бы с:

    export function getRandomSuits(nrOfPlayers) { 
        const rangeMin = 1; 
        const rangeMax = 6; 
        let nums = []; 
    
        while (nums.length < nrOfPlayers) { 
         let nr = Math.floor((Math.random() * rangeMax) + rangeMin); 
         var numberExists = _.indexOf(nums, nr); 
         if(numberExists < 0) { 
          nums.push(nr); 
         } 
        } 
    
        return nums; 
    } 
    
  2. не обязательно. Просто вопрос чистоты и предпочтения.

  3. Может быть? :-)

Второй метод (Немного лучше) с временным массивом:

export function getRandomSuits(nrOfPlayers) { 

    const rangeMin = 1; 
    const rangeMax = 6; 
    var tempNum = []; 
    for(i = 0; i <= rangeMax - rangeMin; i++){ 
     tempNum[i] = rangeMin + i; 
    } 
    let nums = []; 
    while (nums.length < nrOfPlayers) { 
     let index = Math.floor(Math.random() * tempNum.length); 
     var numberExists = _.indexOf(nums, tempNum[index]); 
     if(numberExists < 0) { 
      nums.push(tempNum[index]); 
      tempNum.splice(tempNum, index)); 
     } 
    } 

    return nums; 
} 
+0

Спасибо за очистку :) если вы хотите, вы также можете удалить маленький console.log;) Я использовал внутреннюю функцию, потому что я играл вокруг с рандомизатором, и он был красивее, когда он был вне цикла while. – Winter

+0

@Winter Вы очень желанны. Я это сделаю. –

+0

Вы понимаете, что означает blex, используя временный массив? – Winter

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

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