【问题标题】:How to generate a random permutation in Java?如何在 Java 中生成随机排列?
【发布时间】:2011-07-27 05:30:36
【问题描述】:

生成 n 个数字的随机排列的最佳方法是什么?

例如,假设我有一组数字 1、2 和 3 (n = 3)

所有可能排列的集合:{123, 132, 213, 231, 312, 321}

现在,我该如何生成:

  • 上述集合的元素之一(随机选择)
  • 如上所示的整个排列集

换句话说,如果我有一个包含 n 个元素的数组,我如何随机打乱它们?请协助。谢谢。

【问题讨论】:

    标签: java algorithm random permutation


    【解决方案1】:

    你可以试试RubyCollect4J

    Ruby.Array.of(1, 2, 3).permutation().toA().sample();
    

    它完全符合您的要求。 顺便说一句,我是这个 Java 库的作者。

    【讨论】:

      【解决方案2】:
      java.util.Collections.shuffle(List);
      

      javadoc link for Collections.shuffle

      List<Integer> list = new ArrayList<Integer>();
      list.add(1);
      list.add(2);
      list.add(3);
      java.util.Collections.shuffle(list);
      

      值得注意的是,您可以使用许多算法。以下是它在 Sun JDK 中的实现方式:

      public static void shuffle(List<?> list, Random rnd) {
          int size = list.size();
          if (size < SHUFFLE_THRESHOLD || list instanceof RandomAccess) {
              for (int i=size; i>1; i--)
                  swap(list, i-1, rnd.nextInt(i));
          } else {
              Object arr[] = list.toArray();
      
              // Shuffle array
              for (int i=size; i>1; i--)
                  swap(arr, i-1, rnd.nextInt(i));
      
              // Dump array back into list
              ListIterator it = list.listIterator();
              for (int i=0; i<arr.length; i++) {
                  it.next();
                  it.set(arr[i]);
              }
          }
      }
      

      【讨论】:

      • 非常感谢。但是 api 说它在线性时间内工作。我们是否有可能以低于 O(n) 的复杂度实现这一目标?
      • @Shankar: Yes
      • @Danny 这是可能的,但不切实际。
      • @metdos 你能详细说明一下吗?我相信这是 knuth shuffle,他写了一本关于算法的书。从字面上看。
      • 是的,你是对的。我想我的问题是随机发生器。我创建了一个长度为 3 的列表,我将其洗牌 100000 次,结果并不令人满意(没有像我预期的那样接近统一)
      【解决方案3】:

      你问的是置换生成器吗?因为您的排列集缺少两个数字。无论如何,您可以查看http://www.merriampark.com/perm.htm上的排列生成器

      【讨论】:

      • 我的错!我改变了它。但是,我希望随机生成排列。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-21
      • 1970-01-01
      • 2016-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多