Не случайное число, которое является случайным до
Я знаю, как случайное число использует java Random class.
Это будет случайным числом от 0-13 до 13 раз;
public static void main(String[] args) {
int ctr = 13;
int randomNum = 0;
while(ctr != 0) {
Random r = new Random();
randomNum = r.nextInt(13);
ctr--;
System.out.println(ctr +": " + randomNum);
}
}
Вопрос
- Я хотел бы случайным числом от 0 до 13 раз
-Если первое случайное число равно, например, (5), то мое второе случайное число будет случайным любое число от 0-13 снова ИСКЛЮЧАЯ 5;
Если второе случайное число равно, например, (4), то мое третье случайное число будет случайным для любого числа от 0-13 снова ИСКЛЮЧАЯ 5 и 4;
и т.д..
есть ли способ сделать это?
Ответы
Ответ 1
Сделайте это:
- Создайте
List
размера 13
- Заполните его цифрами 0-12
- Перемешать список с помощью утилиты JDK Collections
- Используйте числа в порядке перетасовки (просто повторяя список)
В коде:
List<Integer> nums = new ArrayList<Integer>();
for (int i = 0; i < 13; i++)
nums.add(i);
Collections.shuffle(nums);
for (int randomNum : nums)
System.out.println(randomNum); // use the random numbers
Ответ 2
Вопрос -I хотел бы случайное число между 0-13 в 13 раз
Я бы начал с List
и Collections.shuffle(List)
и Random
с чем-то вроде -
Random rand = new Random();
List<Integer> al = new ArrayList<>();
for (int i = 0; i < 14; i++) {
al.add(i);
}
Collections.shuffle(al, rand);
System.out.println(al);
Или, если вы используете Java 8+, IntStream.range(int, int)
для создания List
. И вы можете использовать forEachOrdered
для отображения (и в любой из версий вам холодно использовать Collections.shuffle
с неявным случайным), например
List<Integer> al = IntStream.range(0, 13).boxed().collect(Collectors.toList());
Collections.shuffle(al);
al.stream().forEachOrdered(System.out::println);
Ответ 3
Я бы заполнил список, перетасовал его, а затем повторил его, каждый раз гарантируя различное количество:
public static void main(String[] args) {
int ctr = 13;
List<Integer> list = new ArrayList<>(ctr);
for (int i = 0; i < ctr; ++i) {
list.add(i);
}
Collections.shuffle(list);
for (int i = 0; i < ctr; ++i) {
System.out.println(ctr + ": " + list.get(i));
}
}
Ответ 4
Ответы, рекомендующие тасование, показывают правильный путь, поскольку он изящный и быстрый.
Просто для полноты: вы также можете слегка изменить свой код. Добавьте произвольное число в массив. Затем проверьте следующее случайное число, если оно уже находится в массиве. Если да, отбросьте номер и получите новый. Сделайте это до тех пор, пока массив не будет заполнен 13 цифрами.
Вот так:
List<Integer> numbers = new ArrayList<Integer>();
Random r = new Random();
while (numbers.size() < 14) {
randomNum = r.nextInt(13);
if (!numbers.contains(randomNum)) {
numbers.add(randomNum);
}
}
Ответ 5
вы можете использовать Установить в , избегая дублирования
Код:
Set<Integer> set1 = new LinkedHashSet<>();
int ctr = 13;
int randomNum = 0;
while (ctr == 13) {
Random r = new Random();
randomNum = r.nextInt(13);
set1.add(randomNum);
System.out.print(randomNum + " ");
if (set1.size() >= 13) {
ctr = 12;
}
}
System.out.println("");
set1.forEach(i -> System.out.print(" " + i));
выход:
4 11 11 11 5 1 9 12 5 7 5 2 9 10 1 7 10 3 11 8 9 3 12 9 2 6 7 10 12 3 11 1 10 3 6 2 0
4 11 5 1 9 12 7 2 10 3 8 6 0
Ответ 6
ArrayList<Integer> nums = new ArrayList<Integer>();
Random generator = new Random();
for (int i = 0; i < 14; i++) {
nums.add(i);
}
for (int i = 0; i < 14; i++) {
int size = nums.size();
int chosen = generator.nextInt(size);
System.out.println(nums.get(chosen) + " ");
nums.remove(chosen);
}