选择具有特定范围的唯一随机数

ray*_*ray 0 java random probability

我的问题是我希望我的程序在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
Run Code Online (Sandbox Code Playgroud)

NPE*_*NPE 8

你正在有效地寻找从中0到的整数的随机排列n-1.

你可以把这一数字从0n-1ArrayList,然后调用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);
    }
Run Code Online (Sandbox Code Playgroud)

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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

当您遍历此类的实例时,它会生成随机排列:

    ChooseUnique ch = new ChooseUnique(4);
    for (int val : ch) {
        System.out.println(val);
    }
Run Code Online (Sandbox Code Playgroud)

在一个特定的运行中,这打印出来1 0 2 3.