Java 双数组/唯一随机数(卡片组)

Java 双数组/唯一随机数(卡片组),java,eclipse,Java,Eclipse,我正在创建一个程序,它有一副牌的双数组列表。有两个“手”将从这一个甲板处理。必须将5张独特的卡发给“comHand”,这是一个存储5张卡的双阵列。第一个[]存储所发牌的哪一次迭代(第一张牌、第二张牌等),第二个[]在[0]中存储牌套,在[1]中存储牌号 我简化了我的代码,以确保我得到3个唯一的绘图。只有一套西装和三个可能的号码可供选择。我的代码在///之上运行良好(这两个数字总是唯一的)。但是,下面的代码有时不会产生唯一的数字。我能得到一些帮助来辨别这是为什么吗 int comH

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

我简化了我的代码,以确保我得到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;

在连续绘制中,使用“随机”无法确定是否获得唯一。 维护一个数组,存储一个事务的抽取,如果您得到数组中存在的任何抽取,则继续生成一个新的随机数

int-comHand[][]=new-int[5][2];
    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);
    }
ArrayList cards=新的ArrayList(); int totalCards=52//一副牌
对于(int x=1;x您的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)从集合中拾取卡片然后从该集合中移除所选的卡。这样它就不会再次被选中。或者构建一个牌组,洗牌,然后从牌组中弹出顶部卡,直到完成为止。这很容易实现。

我知道这一点……我上面写的代码正在尝试检查数组,以查看是否存在重复的卡。为什么要标记它“Javascript”?@Bergi问得好,希望我在制定完整的Javascript解决方案之前阅读您的评论。(int)(Math.random()*1)将始终返回0,(int)(Math.random()*3)将始终返回0、1或2。这是您想要的吗?我不确定我是否遵循。我的印象是&&意味着两个条件都必须为真,| |意味着只有一个条件必须为真。是的,但您设置它的方式将在一个值唯一时等于假。这就是想法。我想要唯一的抽卡。两个值不需要不同,我可以拥有相同数量的不同套装。我有另一种方法来实现这一点。创建一个可能的数字列表,包括套装。例如1,1,1,1,2,2,2,2,3,3,3…等,然后生成一个随机数,最大值为列表的长度。所选卡片是该索引处的值。然后从列表中删除该值,然后再次随机选择下一张卡片的列表大小为max。很抱歉,这完全不起作用。我现在就写一些类似的代码