我在上课时为了获得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编写的第一个程序之一。
答案 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
:
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