Случайная генерация random int без повтора

188
11 апреля 2019, 20:30

Необходимо прописать генерацию случайных 4х чисел из массива Пока что код выглядит так

Random generator = new Random ();

        final int index1 = generator.nextInt ( imageIds1.length );
        final int randomImageId1 = imageIds1[ index1 ];
        final int index2 = generator.nextInt ( imageIds2.length );
        final int randomImageId2 = imageIds1[ index2 ];
        final int index3 = generator.nextInt ( imageIds3.length );
        final int randomImageId3 = imageIds1[ index3 ];
        final int index4 = generator.nextInt ( imageIds4.length );
        final int randomImageId4 = imageIds1[ index4 ];

Но проблема в том, что числа иногда повторяются. Как этого избежать?

Answer 1

Если вам необходимо сгенерировать некоторое количество K равновероятно выбранных неповторяющихся случайных целых чисел в заданном диапазоне [0, N) и при этом вам разрешается использовать дополнительную поисковую структуру данных для запоминания уже сгенерированных чисел, то алгоритм, который не делает итераций "проб и ошибок" выглядит так

S - множество уже сгенерированных чисел, изначально пустое
for i = N - K to N - 1
  r = random из диапазона [0, i]
  if (r не принадлежит S)
    новое число - r
    добавляем r в S
  else
    новое число - i
    добавляем i в S

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

Answer 2

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

//random numbers are 0,1,2,3...21
    ArrayList<Integer> numbers = new ArrayList<Integer>();
    Random r = new Random();
    while (numbers.size() < 4) {
        int random = r.nextInt(21);
        if (!numbers.contains(random)) {
            numbers.add(random);
        }
    }
    final int index1 = numbers.get (0);
    final int randomImageId1 = imageIds1[ index1 ];

    final int index2 = numbers.get (1);
    final int randomImageId2 = imageIds1[ index2 ];

    final int index3 = numbers.get (2);
    final int randomImageId3 = imageIds1[ index3 ];
    final int index4 = numbers.get (3);
    final int randomImageId4 = imageIds1[ index4 ];
READ ALSO
SQLite. Создание множества однотипных таблиц c разными именами

SQLite. Создание множества однотипных таблиц c разными именами

Имеется приложение которое хранит свои данные в БДВсе таблицы Отличаются только именем и данными

214
Java. Отображение float и double [дубликат]

Java. Отображение float и double [дубликат]

На данный вопрос уже ответили:

212
Мониторинг поля БД Postgresql

Мониторинг поля БД Postgresql

ситуация вот какая: есть таблица в бд Postgresql,в ней есть поле "статус"Требуется выполнить некий кусок Java-кода, при любом изменении статуса

199
Запрос по JDBC только для одного потока

Запрос по JDBC только для одного потока

Есть два потока, которые обращаются к одному классу, который делает запрос в БДМне необходимо сделать так, что бы они физически не могли сделать...

186