Java在for循环中生成随机数

时间:2013-10-04 10:12:58

标签: java loops for-loop random blackjack

我正在创建一个二十一点程序,我正试图在程序开始时向玩家交易随机卡。这是我用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循环存在问题,因为虽然每个玩家的两张牌是随机生成的,但所有玩家都被发给同一张牌。

2 个答案:

答案 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。 但从它的外观来看,问题似乎在其他地方。该函数确实返回了随机值,但您没有在其他地方正确使用它。