【问题标题】:choose unique random numbers with specific range选择具有特定范围的唯一随机数
【发布时间】:2012-04-13 00:08:11
【问题描述】:

我的问题是我希望我的程序在 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

【问题讨论】:

  • 请出示你写的代码。
  • 您正在从一组 4 个数字中选择 4 个随机数字(无需替换)?你真正想要达到什么目的?你只是想随机化数字 0-3 的顺序吗?
  • 它实际上是一个函数而不是整个程序,如果我从数组中选择一个元素,它不会再次选择它,而不是试图随机化我想要的

标签: java random probability


【解决方案1】:

您实际上是在寻找从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);
    }

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

【讨论】:

  • 谢谢,但这并不能解决问题,随机播放不能确保唯一性
  • @ray:确实如此。每个数字在最终列表中恰好出现一次。你试过运行代码吗?
【解决方案2】:

您可以使用从 0 到 3 的数字填充(如果您不需要太多数字)ArrayList&lt;Integer&gt;。然后使用 Random.nextInt(list.size()) 获取随机索引,从列表中获取数字并 removeAt索引中的条目。

【讨论】:

  • ArrayList 中没有 removeAt 方法,能否请放一些代码,我已经尝试了 2 小时来解决它,谢谢
  • 对不起,它只是叫remove(index)
【解决方案3】:

如果您的范围在某种类型的数组中,那么只需在数组长度上使用随机数。

例如,如果您有一个名为 range 的 int 数组。然后你可以使用:

java.utils.Random randomGenarator = new java.utils.Random();
return range[randomGenarator.nextInt(range.length)];

【讨论】:

    猜你喜欢
    • 2015-10-28
    • 1970-01-01
    • 1970-01-01
    • 2013-12-14
    • 2016-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-19
    相关资源
    最近更新 更多