Генерация случайных чисел в определенном диапазоне
Я пытаюсь сгенерировать 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>
Похоже).