Java随机值和重复

时间:2010-12-22 01:50:27

标签: java random duplicates

我有一个52张牌(13x4)的阵列(cards)和另外25张牌(5x5)的阵列(cardsOut)。我想随机将52张卡中的元素复制到25张卡片中。

另外,我不想在5x5阵列中有任何重复。所以这就是我所拥有的:

        double row=Math.random() *13;
        double column=Math.random() *4;

        boolean[][] duplicates=new boolean[13][4];

        pokerGame[][] cardsOut = new pokerGame[5][5];
        for (int i=0;i<5;i++)
            for (int j=0;j<5;j++){
                if(duplicates[(int)row][(int)column]==false){
                    cardsOut[i][j]=cards[(int)row][(int)column];
                    duplicates[(int)row][(int)column]=true;
                }
            }

此代码中存在2个问题。首先,行和列的随机值仅生成一次,因此每次都将相同的值复制到5x5数组中。由于每次都复制相同的值,我不确定我的重复检查器是否非常有效,或者它是否有效。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:7)

我首先建议使用shuffling套牌,然后选择要放入5x5阵列的前25张牌。试图混合这两个步骤是不必要的复杂化。

如果您需要针对性能进行优化(您可能不需要),那么值得注意的是,您可以使用Fisher-Yates shuffle并在选择前25张随机卡后停止算法,而不会对剩余的卡进行洗牌

答案 1 :(得分:5)

我认为你的方法比实际应用更困难。尝试使用名为card的类和两个集合 - 一个名为CardsRemaining,另一个名为CardsUsed。

最初,CardsRemaining包含所有52个卡对象,而CardsUsed为空。随着卡被添加到CardsUsed,它们将从CardsRemaining中删除,自然会防止重复发生。

您的程序最终可能会看起来像这样(抱歉,它在c#中):

  class Program
    {
        static void Main(string[] args)
        {
            List<Card> CardsRemaining=new List<Card>();
            for (int i = 0; i < 12; i++)
            {
                for (int j = 0; j < 4; j++)
                {
                    Card c = new Card(i, j);
                    CardsRemaining.Add(c);
                }
            }
            List<Card> CardsUsed = new List<Card>();
            for(int i=0;i<25;i++)
            {
                int cardIndex = getRandomNumber(CardsRemaining.Count);
                Card c = CardsRemaining[cardIndex];
                CardsRemaining.Remove(c);
                CardsUsed.Add(c);
            }
        }
    }

    class Card
    {
        public int Number;
        public int Color;
        public Card(int number, int color)
        {
            this.Number = number;
            this.Color = color;
        }
    }