我正在创建一个二十一点程序,我正试图在程序开始时向玩家交易随机卡。这是我用Java编写的功能,最初将卡片交给玩家。
public static int[][] initDeal(int NPlayers)
{
int hands[][] = new int[NPlayers][2];
for(int a = 0; a<NPlayers; a++)
{
hands[a][0] = (int)Math.round((Math.random() * 13))-1;
hands[a][1] = (int)Math.round((Math.random() * 13))-1;
}
return hands;
}
我认为Random方法和for循环存在问题,因为虽然每个玩家的两张牌是随机生成的,但所有玩家都被发给同一张牌。
答案 0 :(得分:1)
你需要有一张'Deck'牌或者其他牌,随机洗牌,然后将它们从牌组中移除给玩家。
否则你可以两次同一张牌,这在现实生活中是不可能的。 (虽然可以使用更大的甲板。)
public class Card {
public enum Suit {HEART, DIAMOND, CLUB, SPADE};
public int getValue(); // Ace, Jack, Queen, King encoded as numbers also.
}
public class Deck {
protected List<Card> cardList = new ArrayList();
public void newDeck() {
// clear & add 52 cards..
Collections.shuffle( cardList);
}
public Card deal() {
Card card = cardList.remove(0);
return card;
}
}
如果/当您确实需要生成随机整数时,应使用截断,而不是舍入。否则,底部值只有其预期概率的一半。
int y = Math.round( x)
0 - 0.49 -> 0 // only half the probability of occurrence!
0.5 - 1.49 -> 1
1.5 - 2.49 -> 2
..
没有Math
函数可以截断,只是强制转换为int
。
int faceValue = (int) ((Math.random() * 13)) + 1;
或者,您可以使用Random.nextInt(n)函数执行此操作。
Random rand = new Random();
int faceValue = rand.nextInt( 13) + 1;
填写空白。
答案 1 :(得分:0)
尝试使用班级nextInt(n)
的{{1}}。 java.util.Random
。
但从它的外观来看,问题似乎在其他地方。该函数确实返回了随机值,但您没有在其他地方正确使用它。