2016-10-26 3 views
0

Извините, если это долго, но я пишу программу, которая рисует покерную руку (5 разных карт) из стандартной колоды 52. Единственная часть, с которой я все еще борется, - это получение разных карт. Код, который у меня сейчас, такой же простой, как и он, и работает по большей части, но иногда может рисовать одну и ту же карту более одного раза. Я хочу, чтобы карта была удалена из колоды после ее нарисования, и я застрял на этой части.Как получить различные разные случайные объекты в массиве?

Card[] hand = new Card[5]; 
     for (int i = 0; i < 5; i += 1) 
     { 
      int index = rand.nextInt(52); 
      hand[i] = cards[index]; 
     } 
    return hand; 
+0

Поскольку это массив, вы не можете действительно «удалить» его, поскольку индекс все еще существует; вместо этого, как только вы нарисуете его, попробуйте установить для этого индекса значение null. – SomeStudent

+0

Вы можете получить вдохновение от http://stackoverflow.com/questions/8115722/generating-unique-random-numbers-in-java – SomeDude

+0

, как упоминалось в @SomeStudent, разрешено ли вам использовать что-то еще, чем массив? Например, как ArrayList. Затем вы можете удалить объект, как ваш случайный выбор, а затем он не будет доступен для следующих ничьих (если вы это сделаете, не забудьте вызвать nextInt с переменной: rand.nextInt (numberOfCardsRemaining)). – alexbt

ответ

1

Вы можете создать ArrayList как

List<Card> cards = new ArrayList<>(); 

// add 52 cards to cards 

Card[] hand = new Card[5]; 
for (int i = 0; i < 5; i ++) { 
    int index = rand.nextInt(cards.size()); 
    hand[i] = cards.remove(index); 
} 
+0

Я думаю, что вы имели в виду rand.nextInt (cards.size()) not rand.nextInd (cards.size()) – BigMonkey89WithaLeg

+0

О да, спасибо, что указали это. –

+0

Спасибо! Отмечено, как ответили. –

2

Использование List и Collections.shuffle().

List<Card> cards = new ArrayList<>(52); 
for (int i = 0; i < 52; i++) { 
    cards.add(new Card(i)); // or so 
} 
Collections.shuffle(cards); 

Card[] hand = new Card[5]; 
for (int i = 0; i < 5; i += 1) { 
    hand[i] = cards.remove(0); 
} 

return hand; 
0

Вы можете буквально делать то, что вы делаете с колодой карт:

class Deck 
{ 
    private LinkedList<Card> cards = new LinkedList<Card>(); 

    Deck() 
    { 
      for (i=0; i<52; ++i) { 
       // or however you want to correctly create a card 
       cards.add(new Card(i)) 
      } 
    } 

    public Card takeRandomCard() 
    { 
      int takeCard = rand.nextInt(cards.size()); 
      return cards.remove(takeCard); 
    } 
} 

int handSize = 5; 
Deck deck = new Deck(); 
Card[] hand = new Card[handSize]; 
for (int i=0; i<handSize; ++i) { 
    hand[i] = deck.takeRandomCard(); 
} 

Это не может быть наиболее эффективным методом, но это, надеюсь, совершенно ясно, что он делает.

Вызов случайных карт может быть или не быть быстрее, чем перетасовка всей колоды. LinkedList быстрее, чем ArrayList при удалении случайных записей. Наверное, неважно, хотя на самом деле.

0

Просто создайте List из Integer s от 1 до 50. Я продемонстрировал этот пример, используя Java 1.8.

public class NumUtility { 
    public static List<Integer> shuffle() { 
     List<Integer> range = IntStream.range(1, 53).boxed() 
       .collect(Collectors.toCollection(ArrayList::new)); 
     Collections.shuffle(range); 
     return range; 
    } 
} 

Теперь вы можете выполнять итерацию по индексу от 1 до 5, и всякий раз, когда вы хотите перетасовать цифры, просто вызовите вышеуказанный метод.

Card[] hand = new Card[5]; 

//call this method whereever you want random integers. 
List<Integer> range = NumUtility.shuffle(); 

for (int i = 0; i < 5; i += 1) { 
    hand[i] = range.get(i); 
} 
return hand; 
Смежные вопросы