Java随机值和重复

Sno*_*man 5 java random duplicates

我有一个cards52(13x4)的数组(cardsOut)和另外25个卡(5x5)的数组().我想随机将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;
                }
            }
Run Code Online (Sandbox Code Playgroud)

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

我该如何解决?

Mar*_*ers 7

我建议先将牌组改组,然后选择前25张牌放入5x5阵列.试图混合这两个步骤是不必要的复杂性.

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


Gre*_*som 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;
        }
    }
Run Code Online (Sandbox Code Playgroud)