Проверка массива на дубликаты - PullRequest
0 голосов
/ 06 февраля 2012

Этот метод проверяет и заменяет случайные числа в массиве?

public void generateNumbers()
   {

       for(int counter=0; counter< 6; counter++){

           numbers[counter]= 1+ (int)(Math.random()*49);
           for(int y = counter - 1; y >=0 ; y--){
               if(numbers[counter] == numbers[y]){
                   numbers[counter]= 1+ (int)(Math.random()*49);
                }
           }


    }

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

Диапазон чисел, созданных случайным образом, должен быть 1 - 49.

Ответы [ 2 ]

1 голос
/ 07 февраля 2012

Для таких задач часто бывают лучшие алгоритмы.Ваш пример моделирует лотерею, которую можно описать так: вытяните n элементов из корзины из m элементов .В вашем случае n: = 6;m: = числа от 1 до 49 - но вы можете настроить его по мере необходимости (и даже иметь несколько одинаковых элементов в сегментах).

Итак, лучшим подходом к этой проблеме будет:

  1. Создать базовый список, содержащий все элементы, которые у вас есть до рисования, т. Е. Список, содержащий числа 1..49

  2. Создать пустой результатlist

  3. в цикле, повторяющемся n раз, выполните следующие действия:

    1. выберите случайный индекс вашего списка от 0 до максимального числаэлементы (все еще присутствующие в списке)

    2. Возьмите элемент по индексу из 3.1 из вашего базового списка и добавьте его в свой результат

    3. Удалить элемент по индексу из базового списка.Это гарантирует, что один и тот же номер не появится во второй раз в вашем результате.Следовательно, максимальное количество элементов в вашем базовом списке будет на 1 меньше при следующем выполнении шага 3.1

Я не буду вдаваться в подробности о том, какПрограмма говорит алгоритм на Java, так как его запах очень похож на домашнее задание.

0 голосов
/ 07 февраля 2012

Вам нужно «перемотать» обратно к counter-1 при поиске дубликата, чтобы вы снова начали искать дубликаты:

public void generateNumbers()
{

   for(int counter=0; counter< 6; counter++){

       numbers[counter]= 1+ (int)(Math.random()*49);
       for(int y = counter - 1; y >=0 ; y--){
           if(numbers[counter] == numbers[y]){
               numbers[counter]= 1+ (int)(Math.random()*49);
               y = counter - 1; // <<<===== ADDED
            }
       }


}

Ваш оригинальный метод не будет работать, если вы начнете с этого массива

1 3 7 8

, затем сгенерируйте 3, сравните его с 8 и 7, найдите дубликат 3 и сгенерируйте 8 в качестве замены.На этом этапе ваш алгоритм будет проверять 8 против 1 и быть уверенным, что дубликатов нет;это было бы неправильно.

...