如何在 Java 中生成随机排列?
Posted
技术标签:
【中文标题】如何在 Java 中生成随机排列?【英文标题】:How to generate a random permutation in Java? 【发布时间】:2011-07-27 05:30:36 【问题描述】:生成 n 个数字的随机排列的最佳方法是什么?
例如,假设我有一组数字 1、2 和 3 (n = 3)
所有可能排列的集合:123, 132, 213, 231, 312, 321
现在,我该如何生成:
上述集合的元素之一(随机选择) 如上所示的整个排列集换句话说,如果我有一个包含 n 个元素的数组,我如何随机打乱它们?请协助。谢谢。
【问题讨论】:
【参考方案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上的排列生成器
【讨论】:
我的错!我改变了它。但是,我希望随机生成排列。以上是关于如何在 Java 中生成随机排列?的主要内容,如果未能解决你的问题,请参考以下文章