Я пытаюсь получить случайные числа от 0 до 100. Но я хочу, чтобы они были уникальными, а не повторялись в последовательности. Например, если я получил 5 чисел, они должны быть 82,12,53,64,32, а не 82,12,53,12,32. Я использовал это, но оно генерирует одинаковые числа в последовательности.
publicstaticvoidmain(String[] args) { ArrayList<Integer> list = newArrayList<Integer>(); for (int i=1; i<11; i++) list.add(i); Collections.shuffle(list); for (int i=0; i<3; i++) System.out.println(list.get(i)); } }
Первая часть исправления при оригинальном подходе, как указал Марк Байерс в ответе, который теперь удален, заключается в использовании только одного Random экземпляра.
Именно это приводит к тому, что числа становятся идентичными. A Random экземпляр заполняется текущим временем в миллисекундах. Для определенного начального значения экземпляр 'random' вернет точно такую же последовательность псевдослучайных чисел.
Ответ 2
В Java 8+ вы можете использовать ints метод Random, чтобы получить IntStream количество случайных значений, затем distinct и limit сократить поток до количества уникальных случайных значений.
Random также есть методы, которые создают LongStreams и DoubleStreams, если они вам нужны вместо этого.
Если вам нужны все (или большое количество) чисел в диапазоне в случайном порядке, возможно, было бы эффективнее добавить все числа в список, перетасовать его и взять первое n, потому что приведенный выше пример в настоящее время реализован путем генерации случайных чисел в запрошенном диапазоне и передачи их через набор (аналогично ответу Роба Кьелти), что может потребовать генерации намного большего количества, чем количество, переданное в limit, поскольку вероятность генерации нового уникального числа уменьшается с каждым найденным. Вот пример другого способа:
List<Integer> range = IntStream.range(0, 100).boxed() .collect(Collectors.toCollection(ArrayList::new)); Collections.shuffle(range); range.subList(0, 99).forEach(System.out::println);
Ответ 3
Создайте массив из 100 чисел, затем рандомизируйте их порядок.
Разработайте генератор псевдослучайных чисел с диапазоном 100.
Создайте логический массив из 100 элементов, затем установите значение элемента true при выборе этого числа. При выборе следующего числа сверьтесь с массивом и попробуйте снова, установлен ли элемент массива. (Вы можете создать простой в очистке логический массив с массивом long, куда вы сдвигаете и маскируете для доступа к отдельным битам.)
Ответ 4
Используйте Collections.shuffle() для всех 100 чисел и выберите первые пять, как показано здесь и ниже.
Консоль:
599682482
Код:
privatestaticfinalRandomrnd=newRandom(); privatestaticfinalintN=100; privatestaticfinalintK=5; privatestaticfinal List<Integer> S = newArrayList<>(N);
publicstaticvoidmain(String[] args) { for (inti=0; i < N; i++) { S.add(i + 1); } Collections.shuffle(S, rnd); for (inti=0; i < K; i++) { System.out.print(S.get(i) + " "); } System.out.println(); }