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

时间:2012-12-05 10:36:35

标签: java eclipse

我正在创建一个程序,其中包含一副牌的双数组列表。有两个“手”将从这一个牌组中处理。必须将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;

3 个答案:

答案 0 :(得分: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);
    }

希望这就是你所追求的。

答案 1 :(得分:1)

您的while循环似乎有错误的条件。试试||而不是&amp;&amp;:

 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)从集合中选择卡片,然后从该集合中删除所选的卡片。这样它就不会再次被选中。或者建造一个甲板,将其洗牌,然后从甲板上弹出顶牌直到完成。这很容易实现。

答案 2 :(得分:0)

通过使用随机获取连续绘制中的唯一性,您无法确定。 维护一个数组,存储一个事务的绘制,如果你得到数组中的任何绘制,继续生成一个新的随机数