【问题标题】:Generate set of unique random numbers in Java在 Java 中生成一组唯一的随机数
【发布时间】:2012-03-14 11:26:15
【问题描述】:

我想在 0-500 范围内创建 10 个随机数。但问题是我希望这些数字是唯一的。对于 2 个随机数,我可以创建如下内容:

int randomItem1 = r.nextInt(500);
int randomItem2 = r.nextInt(500);
while(randomItem1==randomItem2){
    randomItem1=randomItem();
    randomItem2=randomItem();
}

但是如果我这样做 10 次,我认为它会堆叠。我这么说是因为我正在尝试创建一个巨大的算法,该算法试图进行连续评估,并且我希望不断地获取 10 个随机且唯一的数字。我不知道该怎么办。有什么想法或建议吗?

【问题讨论】:

标签: java


【解决方案1】:

Java Collections 有一个 shuffle 方法。您可以将数字放入 ArrayList 中,然后随机播放其内容。如果 ArrayList 包含 n 个数字,则调用 shuffle 方法会为您提供包含 n 个数字但随机排列的相同 ArrayList。

for(int i=0;i<10;i++){
list.add(i);  // list contains: [0,1,2,3,4,5,6,7,8,9]
}
Collections.shuffle(list);// list now contains: [0, 9, 3, 1, 5, 8, 7, 2, 6, 4]

【讨论】:

    【解决方案2】:

    从 1 到 500 的数字中创建一个 LinkedList,并在每次使用 The Fisher-Yates shuffle 的数字时随机抽取其中一个。

    这将为您拉出的每个数字提供有保证的正常(恒定时间)性能。

    【讨论】:

      【解决方案3】:

      看起来您将这些存储在单独的变量中。像这样存储项目组的“正常”位置通常是在列表或数组中。

      在这种情况下,请将它们存储在“集合”数据结构中。它不允许重复。

      设置文档: http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Set.html

      Set set = new HashSet();
      
      while (set.size() < 10) {
          set.add(r.nextInt(500));
      }
      

      【讨论】:

      • 这是一个简洁的解决方案,再加上一个
      【解决方案4】:

      我会使用一个数组,并将生成的数字存储到该数组中。您将生成一个新的随机数,然后需要遍历您的数组直到您的数字计数,检查它是否与您之前创建的任何匹配。

      【讨论】:

      • 那将是一个糟糕的设计。不确定的 CPU 需求。前面的回复更重要:创建一组合格数字的源集,“随机播放”,然后迭代生成的随机列表。
      • 对于这个解决方案,我觉得主要问题是编写更多代码,而不是使用现成的数据结构。因为您不会使用现成的数据结构(例如集合),所以您将花费更多时间编写和调试代码。根据您的应用程序,考虑到 OP 只需要 10 个随机数,我不确定我是否会非常担心 CPU 需求。但是,许多现成的“集合”数据结构也将被设计为使用比您上面建议的 O(n^2) 算法更有效的东西。
      猜你喜欢
      • 2011-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-05
      • 1970-01-01
      相关资源
      最近更新 更多