0

我正在创建一个程序,该程序具有一副纸牌的双数组列表。有两个“手”将从这一套牌中处理。必须将 5 张独特的牌发给“comHand”,这是一个存储 5 张牌的双数组。第一个 [] 存储正在处理的牌的迭代(第一张牌、第二张牌等),第二个 [] 将牌的花色存储在 [0] 中,将牌的编号存储在 [1] 中。

我简化了代码以确保获得 3 次独特的抽奖。只有一套花色和 3 个可能的号码可供选择。我的代码在 /// 上方运行良好(这两个数字始终是唯一的)。但是,下面的代码有时不会产生唯一的数字。我可以得到一些帮助来辨别这是为什么吗?

        int comHand [][] = new int [5][2];
        card1 = (int) (Math.random()*1);
        card2 = (int) (Math.random()*3);

        comHand[0][0] = card1;
        comHand[0][1] = card2;

        card1 = (int) (Math.random()*1);
        card2 = (int) (Math.random()*3);

        while (card1 == comHand[0][0] && card2 == comHand[0][1]){
            card1 = (int) (Math.random()*1);
            card2 = (int) (Math.random()*3);}

        comHand[1][0] = card1;
        comHand[1][1] = card2;

        ///

        card1 = (int) (Math.random()*1);
        card2 = (int) (Math.random()*3);

        while (card1 == comHand[0][0] && card2 == comHand[0][1]){
            card1 = (int) (Math.random()*1);
            card2 = (int) (Math.random()*3);}
        while (card1 == comHand[1][0] && card2 == comHand[1][1]){
            card1 = (int) (Math.random()*1);
            card2 = (int) (Math.random()*3);}

        comHand[2][0] = card1;
        comHand[2][1] = card2;
4

3 回答 3

1

您的 while 循环似乎有错误的条件。试试|| 代替 &&:

 while (card1 == comHand[0][0] || card2 == comHand[0][1]) {
            card1 = (int) (Math.random()*1);
            card2 = (int) (Math.random()*3);
 }

我会尝试另一种方法,因为“重复 Math.random() 直到一切正常”不是一个好的算法。很难预测算法需要完成多少步(以及它是否总是会完成)。

使用卡片对象而不是 int 数组。使用 Math.random(或 Random)从集合中挑选卡片,然后从该集合中移除选定的卡片。这样就不会再被选中了。或者建立一个套牌,洗牌,然后从套牌中弹出最上面的牌,直到完成。这很容易实现。

于 2012-12-05T11:07:19.037 回答
1
    int comHand [][] = new int [5][2];
    ArrayList<Integer> cards = new ArrayList<Integer>();
    int totalCards = 52; //Cards in a pack
    for(int x = 1; x <= totalCards; x++)
    {
        cards.add(x);
    }
    //Repeat for 5 cards
    for(int y = 0; y < 5; y++)
    {
        int selectCard = (int)(Math.random()*cards.size()-1);
        comHand[y][0] = cards.get(selectCard) % 13; //13 cards per suit
        comHand[y][1] = cards.get(selectCard) / 13;
        cards.remove(selectCard);
    }

希望这就是你所追求的。

于 2012-12-05T10:49:54.673 回答
0

您不能通过使用随机来确定连续抽奖中的唯一性。维护一个数组,存储一个交易的抽奖,如果你得到数组中存在的任何抽奖,继续生成一个新的随机数

于 2012-12-05T10:42:21.160 回答