Java случайные значения и дубликаты - PullRequest
5 голосов
/ 22 декабря 2010

У меня есть массив (cards) из 52 карт (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;
                }
            }

2 проблемы в этом коде.Во-первых, случайные значения для строки и столбца генерируются только один раз, поэтому одно и то же значение каждый раз копируется в массив 5x5.Поскольку одни и те же значения копируются каждый раз, я не уверен, насколько эффективна моя программа проверки дубликатов или она работает вообще.

Как это исправить?

Ответы [ 2 ]

7 голосов
/ 22 декабря 2010

Я бы рекомендовал перетасовать колоду на месте, а затем выбрать первые 25 карт для размещения в вашем массиве 5x5.Попытка смешать эти два шага - ненужное осложнение.

Если вам нужно оптимизировать производительность (вы, вероятно, этого не делаете), то стоит отметить, что вы можете использовать случай Фишера-Йейтса и остановите алгоритм после выбора первых 25 случайных карт, не перетасовывая оставшиеся карты.

5 голосов
/ 22 декабря 2010

Я думаю, что ваш подход делает это более сложным, чем должно быть.Попробуйте использовать класс с именем 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;
        }
    }
...