Java 用Collections.shuffle()计算给定数字集合的一百万个不同排列?

Java 用Collections.shuffle()计算给定数字集合的一百万个不同排列?,java,algorithm,permutation,Java,Algorithm,Permutation,我目前正在进行一项关于Project Euler的练习,任务要求我找到一系列数字的第一百万个排列,现在我有两个选项,要么定义自己的算法来找到第一百万个排列,要么使用Collections.suffle()方法,我不确定Collections.suffle()方法是否可以计算100万个不同的排列 第一百万个数字是通过对所有排列进行排序来决定的,但是您可以忽略这一部分 我的问题: 是否可以使用集合.shuffle()生成一系列数字的100万个不同排列?如果不是,您认为生成一百万个不同排列的一系列数字

我目前正在进行一项关于Project Euler的练习,任务要求我找到一系列数字的第一百万个排列,现在我有两个选项,要么定义自己的算法来找到第一百万个排列,要么使用
Collections.suffle()
方法,我不确定
Collections.suffle()
方法是否可以计算100万个不同的排列

第一百万个数字是通过对所有排列进行排序来决定的,但是您可以忽略这一部分

我的问题:

是否可以使用集合.shuffle()生成一系列数字的100万个不同排列?如果不是,您认为生成一百万个不同排列的一系列数字的最佳方法或最佳方法是什么

这是Project Euler提供的内容:

第一百万个数字的字典排列是什么:


请注意-我实际上不希望有人帮我解决这个练习。只要回答我上面的问题就行了。谢谢。

我想这就是你要找的

public static <V> HashSet<HashSet<V>> getCombos(HashSet<V> elements, int size) {
    HashSet<HashSet<V>> combos = new HashSet<HashSet<V>>();
    HashSet<V> inner = new HashSet<V>();
    recur(elements, combos, inner, size);
    return combos;

}

public static <V> HashSet<V> dupe(HashSet<V> orig) {
    return new HashSet<V>(orig);
}

public static <V> void recur(HashSet<V> curr, HashSet<HashSet<V>> combos, HashSet<V> base, int size) {
    if (curr.size() == size) {
        combos.add(dupe(curr));
    } else {
        HashSet<V> inner = dupe(base);
        for (V v : base) {
            inner.remove(v);
            curr.add(v);
            recur(curr, combos, inner, size);
            curr.remove(v);
        }
    }
}
publicstatichashset-getCombos(HashSet元素,int-size){
HashSet combos=新HashSet();
HashSet-inner=新的HashSet();
重现(元素、组合、内部、大小);
返回组合;
}
公共静态HashSet dupe(HashSet orig){
返回新哈希集(orig);
}
公共静态void recur(HashSet curr、HashSet组合、HashSet base、int size){
如果(当前大小()=大小){
组合。添加(重复(当前));
}否则{
HashSet-inner=dupe(基);
对于(V:基础){
内部。移除(v);
货币加(v);
重现(当前、组合、内部、大小);
电流移除(v);
}
}
}

在给定一组元素的情况下,使用递归生成大小为n的所有唯一组合。

我认为这就是您要寻找的

public static <V> HashSet<HashSet<V>> getCombos(HashSet<V> elements, int size) {
    HashSet<HashSet<V>> combos = new HashSet<HashSet<V>>();
    HashSet<V> inner = new HashSet<V>();
    recur(elements, combos, inner, size);
    return combos;

}

public static <V> HashSet<V> dupe(HashSet<V> orig) {
    return new HashSet<V>(orig);
}

public static <V> void recur(HashSet<V> curr, HashSet<HashSet<V>> combos, HashSet<V> base, int size) {
    if (curr.size() == size) {
        combos.add(dupe(curr));
    } else {
        HashSet<V> inner = dupe(base);
        for (V v : base) {
            inner.remove(v);
            curr.add(v);
            recur(curr, combos, inner, size);
            curr.remove(v);
        }
    }
}
publicstatichashset-getCombos(HashSet元素,int-size){
HashSet combos=新HashSet();
HashSet-inner=新的HashSet();
重现(元素、组合、内部、大小);
返回组合;
}
公共静态HashSet dupe(HashSet orig){
返回新哈希集(orig);
}
公共静态void recur(HashSet curr、HashSet组合、HashSet base、int size){
如果(当前大小()=大小){
组合。添加(重复(当前));
}否则{
HashSet-inner=dupe(基);
对于(V:基础){
内部。移除(v);
货币加(v);
重现(当前、组合、内部、大小);
电流移除(v);
}
}
}
在给定一组元素的情况下,使用递归生成大小为n的所有唯一组合。

集合。shuffle()只需按随机排列顺序洗牌数组即可。由于需要遵循字典顺序,因此不能使用collections.shuffle()。此外,当使用collections.shuffle()时,排列次数不能保证您将拥有所有排列,因为collections.shuffle()可以多次生成相同的排列。 对于如何做到这一点,这里有一些很好的链接,解释如何使用阶乘数制

collections.shuffle()只需按随机排列顺序洗牌数组。由于需要遵循字典顺序,因此不能使用collections.shuffle()。此外,当使用collections.shuffle()时,排列次数不能保证您将拥有所有排列,因为collections.shuffle()可以多次生成相同的排列。
对于如何做到这一点,这里有一些很好的链接,解释如何使用阶乘数制

欢迎来到堆栈溢出!虽然您可能已经解决了该用户的问题,但仅使用代码的答案对将来遇到此问题的用户没有多大帮助。请编辑您的答案,解释为什么您的代码解决了原始问题。欢迎使用堆栈溢出!虽然您可能已经解决了该用户的问题,但仅使用代码的答案对将来遇到此问题的用户没有多大帮助。请编辑您的答案,以解释为什么您的代码解决了原始问题。为什么该问题被否决?我投票将此问题作为非主题关闭,因为堆栈溢出不是代码编写服务。尽管你说你不想让我们写代码,但如果不这样做,就无法回答这个问题。请看:为什么这个问题被否决了?我投票结束这个问题,因为堆栈溢出不是一个代码编写服务。尽管你说你不想让我们写代码,但如果不这样做,就无法回答这个问题。请参阅:至于在生成排列后将只是Collections.sort()的字典顺序。是的,你是对的,将会有很多重复的排列,但是,我希望使用某种循环,但是只添加生成的排列,如果它还没有包含在我的排列列表中,并且忽略重复。感谢您的建议,我将查看附加的链接。至于在生成排列后的字典顺序,它只是Collections.sort()。是的,你是对的,将会有很多重复的排列,但是,我希望使用某种循环,但是只添加生成的排列,如果它还没有包含在我的排列列表中,并且忽略重复。谢谢你的建议,我会看看附加的链接。