Java - генерировать случайный диапазон конкретных чисел без дублирования этих чисел - как? - PullRequest
1 голос
/ 07 марта 2011

Звучит достаточно просто ... но я затягиваю это, пытаясь найти единственное и полное решение.

Для диапазона чисел, скажем, 1-12 Я хочу сгенерировать случайную последовательность в этом диапазоне, и включают 1 и 12 .

Я не хочухотя дубликаты чисел .

Так что я бы хотел что-то вроде этого - 3,1,8,6,5,4 .. и так далее, каждое число от 1-12.

Затем я хочу поместить эти случайные числа в Array и использовать этот массив для «случайного» выбора и отображения некоторых элементов (например, инвентарь, извлеченный из базы данных) на странице JSP.

Проблема с тем, что яДо сих пор пытались выяснить, существует ли много повторяющихся номеров ... или не выбрано ALL номеров.

Есть ли простое решение этой проблемы?


Редактировать

Тест № 1 с использованием Collections и shuffle() метода-

ArrayList<Integer> list = new ArrayList<Integer>(10);
for(int i = 0; i < 10; i++)
{
  list.add(i);
}
Collections.shuffle(list);

String[] randomNumbers = (String[])list.toArray();

for(int i = 0; i < 10; i++)
{
  out.print(randomNumbers[i]+"<br>");
}

ResuЭто была последовательность с дублирующимися значениями -
выбрано = 3
выбрано = 8
выбрано = 7
выбрано = 5
выбрано = 1
выбрано = 4
выбрано = 6
выбрал = 4
выбрал = 7
выбрал = 12

Тест № 2 - с использованием класса математики Random

int max = 12;
int min = 1;

int randomNumber = 0;

String str_randomNumber = "";

for(int i=0; i<10; i++) {
    //int choice = 1 + Math.abs(rand.nextInt(11));
    int choice = min + (int)(Math.random() * ((max - min) + 1));

    out.print("chose = "+choice+"<br>");
}

Результат был похож на Collections.shuffle().

Ответы [ 6 ]

3 голосов
/ 07 марта 2011

Вы можете заполнить массив всеми значениями от 1 до 12, а затем перемешать их (см., Например, Почему Collections.shuffle () не работает для моего массива? )

2 голосов
/ 07 марта 2011

Вы можете поместить все числа от 1 до 12 по порядку в массив, а затем использовать некоторый алгоритм тасования для рандомизации их порядка, например. http://www.leepoint.net/notes-java/algorithms/random/random-shuffling.html.

0 голосов
/ 05 декабря 2018

Это служебный метод для создания случайного целого числа:

public static int randomInteger(int min, int max) {
    Random rd = new Random();
    return rd.nextInt((max - min) + 1) + min;
}

Это алгоритм, который всегда создает уникальный набор целых чисел:

public static Set<Integer> makeRandomSet(int howManyNumber, int startNumber, int endNumber){
    Set<Integer> integerSet = new HashSet<>();

    boolean couldBeAdded = false;
    for(int i=0; i< howManyNumber; i++) {
        while (!couldBeAdded) {
            Integer randomInt = randomInteger(startNumber, endNumber);
            couldBeAdded = integerSet.add(randomInt);
        }

        couldBeAdded = false;
    }

    return integerSet;
}

Мы использовали метод добавления возвращаемый тип, чтобы проверить дублирующее значение в нашем наборе.

А вот код теста:

public static void main(String[] args) {
    Set<Integer> randomSet = makeRandomSet(6, 1, 54);
    System.out.println(randomSet);
}

Вывод вышеуказанного кода: 6 случайных уникальных целых чисел от 1 до 54

0 голосов
/ 08 марта 2011

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

List<Integer> list = new ArrayList<Integer>();

for (int i = 1; i <= 12; i++) {
    list.add(i);
}

Collections.sort(list, new Comparator<Integer>() {

    @Override
    public int compare(Integer o1, Integer o2) {
          return Math.random() > 0.5 ? 1 : -1;
    }
);
Integer[] array = list.toArray(new Integer[list.size()]);
0 голосов
/ 07 марта 2011

Если вы используете MySQL или SQLLite в качестве базы данных, вы можете сделать это рандомизацию на уровне запроса SELECT, используя ORDER BY RAND () для ограничения 1-12, вы можете поместить предложение where WHERE ID> = 1 AND ID < = 12 ЗАКАЗАТЬ ПО RAND ()

0 голосов
/ 07 марта 2011

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

  1. Создать случайное число (я буду называть это число X).
  2. Добавить в объект Set.
  3. Проверьте размер объекта Set, если это желаемый размер, все готово.Если он меньше требуемого размера, перейдите к шагу 1
...