Не случайное число, которое является случайным до

Я знаю, как случайное число использует 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);
}