Генерация случайных чисел в определенном диапазоне

Я пытаюсь сгенерировать n случайные числа от 0 до 31 в моем коде Android. Ниже приведен код, который я использую:

int max_range = 31;
SecureRandom secureRandom = new SecureRandom();
int[] digestCodeIndicesArr = new int[indices_length];
int i = 0, random_temp = 0;

while (i != indices_length-1) {
    random_temp = secureRandom.nextInt(max_range);
    if (!Arrays.asList(digestCodeIndicesArr).contains(random_temp)) {
        digestCodeIndicesArr[i] = random_temp;
        i++;
    }
}

indices_length это количество случайных чисел, которые мне нужны. Обычно это 6,7 или 9. Но когда я печатаю сгенерированный массив, я обычно вижу дубликаты. Может кто-то указать на ошибку, которую я делаю. Я добавил строку кода ниже, чтобы отфильтровать случайные дубликаты:

if (!Arrays.asList(digestCodeIndicesArr).contains(random_temp))

Заранее спасибо!

2 ответа

Решение

Arrays.asList(digestCodeIndicesArr) не производит List<Integer> с size() == digestCodeIndicesArr.length,
Это производит List<int[]> с size() == 1где первый (и единственный) элемент - это массив.
Как таковой, он никогда не будет содержать random_temp, так ! contains() всегда верно.

Производительность не позволяет постоянно создавать список и выполнять последовательный поиск для поиска дубликатов. Использовать Set вместо этого, что вы поддерживаете параллельно с массивом, или использовать LinkedHashSet Сначала преобразуйте в массив.

В любом случае, это объясняет, почему ваш код не работал. Двойная ссылка, предоставленная Тунаки, и дублирующая ссылка, которую я предоставил в комментарии, объясняют, как на самом деле делать то, что вы пытались сделать.

Вам нужно изменить:

int[] digestCodeIndicesArr = new int[indices_length];

чтобы:

Integer[] digestCodeIndicesArr = new Integer[indices_length];

так как Arrays.asList(digestCodeIndicesArr) является List<int[]>и не то, что вы подумали, наверное (List<int> или же List<Integer> Похоже).

Другие вопросы по тегам