如何使用随机停止获取相同的数字

时间:2017-09-20 01:26:02

标签: java

我在上课时为了获得7张随机卡片。现在想要修改它以获得21张不重复的随机卡。我正在尝试建立另一个卡猜测游戏程序。我修改了它给了我21张牌,但我总是得到重复的牌。我在想也许可以使用种子。但我对他们的了解不够有效。

import java.util.*;

public class SuchaDeal
{
  public static void main(String[] args)
  {
    Random generator = new Random();       
    int i = 1;   
    String cardSuit;
    int card;    // a card number from 0 to 51
    int cardNum;
    String cardRank = "";

    while (i <= 21)   // loop through 21 times
    {
      card = generator.nextInt(52);   // Returns 0 – 51 
      cardNum = card % 13;    // number between 0-12 for the rank    
      //classify card into suits here

      if ( card  <= 12) 
      {
        cardSuit = " Clubs ";  
      }
      else if ( card  >= 13 && card <= 25  )
      {
        cardSuit = " Diamonds "; 
      }
      else if ( card  >= 26 && card <= 38)
      {
        cardSuit = " Spades "; 
      }
      else
      {
        cardSuit = " Hearts ";
      }

      //name the ranks
      switch (cardNum)
      {
        case 0: cardRank = "Ace";    break;
        case 10: cardRank = "Jack";  break;
        case 11: cardRank = "Queen"; break;
        case 12: cardRank = "King";  break; 
        default: cardRank = "" + (cardNum + 1);
      }
      //print the results   
      System.out.println("Card " + i + " is a " + cardRank + (" of ") + cardSuit);

      i++; // increment the counter
    }
  }
}

我知道这不是最漂亮的代码,但这是我要用java编写的第一个程序之一。

2 个答案:

答案 0 :(得分:2)

如果您想使用这种方法,只有当您制作的卡片是唯一的时候才增加i,可能会将创建的卡片存储在某个阵列中,然后检查新生成的卡片是否为已存在,丢弃并重新运行循环/计算(如果存在)。

然而,如果你打算建立一个完整的套牌,这种方法非常幼稚 - 因为随着已经生产的牌数越来越高,随机生产一张独特牌的可能性越来越低。 (一旦你有51张卡,你可能需要在你随机生成唯一剩余的卡之前将这个循环向上运行52次)

相反,您可以通过编程方式构建一副52张牌,或者作为硬编码阵列,然后使用像Fisher-Yates这样的混洗算法:

 static void shuffleArray(int[] ar)
  {
    // If running on Java 6 or older, use `new Random()` on RHS here
    Random rnd = ThreadLocalRandom.current();
    for (int i = ar.length - 1; i > 0; i--)
    {
      int index = rnd.nextInt(i + 1);
      // Simple swap
      int a = ar[index];
      ar[index] = ar[i];
      ar[i] = a;
    }
  }

现在,你有一个完整的套牌&#39;那是随机洗牌的。然后,使用Arrays.copyOfRange

获取前21张卡片
Arrays.copyOfRange(cardArray, 0, 20);

答案 1 :(得分:0)

正如评论中所建议的那样,你应该进行一次改组,而不是随机生成单张牌。

我将给出的另一个建议是正确建模卡片和套装。

伪码:

enum Suit {
    SPADE, HEART, DIAMOND, CLUB
}

class Card {
    private Suit suit;
    private int number;  // 1 = Ace... 13 = King
    Card(Suit suit, int number) {....}

    // Getters, toString(), equals(), hashCode()
    // no setters, as this is good candidate for immutable class
}

主要逻辑

List<Card> deck = new ArrayList<>();
for (suit : Suit.values) {
    for (num = 1 to 13) {
        deck.add(new Card(suit, num));
    }
}
// now you have a deck of 52 cards

// shuffle the decek
Collections.shuffle(deck);

// take first 20 card from deck, by whatever way you like