choose unique random numbers with specific range

前端 未结 3 1799
南方客
南方客 2021-01-27 10:04

my problem is I want my program to make four unique random choices in range of numbers between 0 to 3 I tried to do it in random class but I could not, , if you could help by co

相关标签:
3条回答
  • 2021-01-27 10:46

    You're effectively looking for a random permutation of the integers from 0 to n-1.

    You could put the numbers from 0 to n-1 into an ArrayList, then call Collections.shuffle() on that list, and then fetch the numbers from the list one by one:

        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() guarantees that all permutations occur with equal likelihood.

    If you wish, you could encapsulate this into an 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();
            }
        }
    

    When you iterate over an instance of this class, it produces a random permutation:

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

    On one particular run, this printed out 1 0 2 3.

    0 讨论(0)
  • 2021-01-27 10:52

    You could fill an (if you don't need too many numbers) ArrayList<Integer> with numbers ranging from 0 - 3. Then you get a random index using Random.nextInt(list.size()), get the number from the list and removeAt the entry at your index.

    0 讨论(0)
  • 2021-01-27 10:54

    If you have your range in sometype of array, then just use a random over the length of the array.

    For example if you have an int array called range. Then you could use:

    java.utils.Random randomGenarator = new java.utils.Random();
    return range[randomGenarator.nextInt(range.length)];
    
    0 讨论(0)
提交回复
热议问题