выбрать уникальные случайные числа с определенным диапазоном - PullRequest
0 голосов
/ 29 марта 2012

моя проблема в том, что я хочу, чтобы моя программа делала четыре уникальных случайных выбора в диапазоне чисел от 0 до 3, я пытался сделать это в случайном классе, но не смог, если вы могли бы помочь с помощью кода, это будет здорово, мой программа будет примерно такой, чтобы было понятно

my range

0 1 2 3  randomly chosen number 3

0 1 2    randomly chosen number 1

0 2      randomly chosen number 2

0        it will choose 0 and then the program closes

Ответы [ 3 ]

8 голосов
/ 29 марта 2012

Вы фактически ищете случайную перестановку целых чисел от 0 до n-1.

Вы можете поместить числа от 0 до n-1 в ArrayList, затемвызовите Collections.shuffle() в этом списке, а затем извлеките числа из списка по одному:

    final int n = 4;
    final ArrayList<Integer> arr = new ArrayList<Integer>(n); 
    for (int i = 0; i < n; i++) {
        arr.add(i);
    }
    Collections.shuffle(arr);
    for (Integer val : arr) {
        System.out.println(val);
    }

Collectons.shuffle() гарантирует, что все перестановки происходят с равной вероятностью.

Если вы хотите, вы можете инкапсулировать это в Iterable:

    public class ChooseUnique implements Iterable<Integer> {

        private final ArrayList<Integer> arr;

        public ChooseUnique(int n) {
            arr = new ArrayList<Integer>(n);
            for (int i = 0; i < n; i++) {
                arr.add(i);
            }
            Collections.shuffle(arr);
        }

        public Iterator iterator() {
            return arr.iterator();
        }
    }

Когда вы перебираете экземпляр этого класса, он производит случайную перестановку:

    ChooseUnique ch = new ChooseUnique(4);
    for (int val : ch) {
        System.out.println(val);
    }

На одном конкретном прогоне распечатывается 1 0 2 3.

0 голосов
/ 29 марта 2012

Если у вас есть диапазон в некотором типе массива, просто используйте случайное значение по длине массива.

Например, если у вас есть массив int с именем range.Тогда вы можете использовать:

java.utils.Random randomGenarator = new java.utils.Random();
return range[randomGenarator.nextInt(range.length)];
0 голосов
/ 29 марта 2012

Вы можете заполнить (если вам не нужно слишком много чисел) ArrayList<Integer> числами от 0 до 3. Затем вы получите случайный индекс, используя Random.nextInt(list.size()), получите номер из списка и removeAtзапись в вашем индексе.

...