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

标签 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

最佳答案

您实际上正在寻找从 0n-1 的整数的随机排列。

您可以将 0n-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);
    }

Collections.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

关于java - 选择具有特定范围的唯一随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9923781/

相关文章:

java - 如何更改 JOptionpane 中图标的位置?

java - 我如何从 Bloomberg API 获取交易假期

java - 如何用 StringUtils.equals 替换所有 String.equals

java - 从数组列表中获取随机单词

java - 您可以使用 java.util.Random 找到以前生成的随机数吗?

c++ - 从Poisson分布中提取数字的性能较低

r - 给定数字和 n 组,如何将数字随机分成多个数字?

Java 循环外对象引用

algorithm - 在行和列中具有两个不相邻的非零值的等概率随机平方二进制矩阵的算法

c++ - 使用 C++ 或 Python 生成随机数