Два генератора случайных чисел (раздача карт) - PullRequest
0 голосов
/ 10 февраля 2012

Мне нужна помощь с этой частью моего кода. Эта часть имеет дело с генерацией 2 случайных чисел и использованием этого случайного числа для одновременного отображения карточки в каждом из 2 полей с метками. Проблема здесь в том, что случайные числа не генерируются должным образом, и поэтому карты не отображаются должным образом (есть повторение, иногда нет отображения и т. Д.)

Основы моего кода: Предположим, что h, который является переменной из другой части кода, является любым числом от 1 до 53 (каждое число относится к карточке). Если сгенерированное случайное число (неповторение) соответствует переменной h, таймер останавливается.

Таким образом, это в основном похоже на колоду карт и раздачу карт равномерно двум людям, но здесь торговля прекращается, когда совпадает число, относящееся к случайно выбранной карте (число).

(l3, l4 - названия меток) Глобальные переменные:

    Random rng = new Random();
    List<Integer> generated = new ArrayList<Integer>();
    List<Integer> generated2 = new ArrayList<Integer>();
    int l3count;
    int l4count;
    int Ulim = 53;
    int Llim = 1;
    int next;
    int check;
    int h;
    int next2;
    int Ulim2 = 53;
    int Llim2 = 1;



final int p = h;
            int delay2 = 1000;
    final Timer timer2 = new Timer();
      timer2.schedule(new TimerTask(){
     public void run(){

      for (int i = 1; i < 53; i++)
    {
        while(true)
        {
             next = rng.nextInt(Ulim) + Llim;
            if (!(generated.contains(next)||generated.contains(next2)))
            {

                generated.add(next);
                break;
            }

            next2 = rng.nextInt(Ulim2) + Llim2;
            if (!(generated.contains(next)||generated.contains(next2)))
            {

                generated.add(next2);
                break;
            }


        }

        String a = Integer.toString(next);
            String c = "C:\\Users\\mycompname\\Desktop\\deck\\"+a+".png";

             String d = Integer.toString(next2);
            String e = "C:\\Users\\mycompname\\Desktop\\deck\\"+d+".png";

            for(int j = 1;j<=53;j++)
            {
            if(j%2==0)
            {l3.setIcon(new ImageIcon(c));
           }
            else
            {l4.setIcon(new ImageIcon(e));    
           }
            }


            if(next==p||next2==p)
            check=10;    
          break;
    }
      if(check==10)
      timer2.cancel();
    timer2.purge();
      }

      },delay2, 1000);

Любая помощь будет оценена. Спасибо за ваше время.

Ответы [ 2 ]

2 голосов
/ 10 февраля 2012

Вам было бы лучше раздавать карты в случайном порядке.

Используя O(n) Knuth Shuffle вы можете передавать по одной карте за раз, от одного массива к другому.

Каждый новый массив, которому вы передаете карту, будет принадлежать разным людям.

Продолжайте добавлять по 1 карте за раз в каждый массив из массива колод, пока у каждого игрока не будет количество карт.ваши правила требуют.

Кроме того, не полагайтесь на равные случайные числа.Смотри тупо-сортировка .Ищите другой шаблон вместо этого.Подобно случайному количеству карт% cards_left, вы должны прекратить выдавать карты.

Обновление с примером кода, согласно запросу :

public static void shuffle (int[] array) {
    for(int n = array.length; (n > 1);) {
        int k = gen.nextInt(n--);
        int temp = array[n];
        array[n] = array[k];
        array[k] = temp;
    }
}
1 голос
/ 10 февраля 2012

Очевидная проблема заключается в том, что Random.nextInt генерирует число 0 (включительно) и n (исключение). Поэтому, когда вы устанавливаете ограничение в 53, вы генерируете значения от 0 до 52 - это 53 возможных значения, и карт не так много. Поэтому измените верхний предел на 52.

Кроме того, как отмечают другие ответы, причина ваших столкновений (раздачи одной и той же карты в несколько рук) и т. Д. Заключается в том, что вы не хотите выбирать карты случайным образом. Вы действительно хотите случайным образом перетасовать колоду.

Попробуйте вместо этого использовать алгоритм shuffle .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...