如何在数组中获得不同的随机对象?

时间:2016-10-26 02:42:33

标签: java arrays for-loop return indexof

很抱歉,如果这很长,但我正在编写一个程序,从52的标准套牌中抽出一手扑克牌(5张不同的牌)。我唯一仍在努力的部分是获得不同的牌。我现在的代码就像它获得的一样简单并且大部分都有用,但有时可以多次绘制同一张卡。我希望卡片一旦被拉出就从卡座中取出,并且卡在那部分上。

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

4 个答案:

答案 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;

答案 1 :(得分: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);
}

答案 2 :(得分: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快。可能真的无关紧要。

答案 3 :(得分:0)

只需创建一个范围为1到50的List Integer。我已使用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;