Java中的java.util.Collections.shuffle(List list)方法能否以与“发送到shuffle的顺序”相同的顺序返回列表?

3

这个文档说“所有排列出现的可能性大致相等”,但我不知道是否包括返回相同的顺序(尽管可能性很小)。我有一种方法(见下文),在两次测试运行中,列表以原始顺序返回,也许...其他因素可能有问题,例如可能选择了一个变位词,结果是一个单词。词典约为300,000个单词,因此我已将该方法更改为更合适的测试,以防止这种情况发生。

private static char[] nextScrambledWord(int wordLength) {

    String word;
    do {
        word = "ABCDEF"; //TODO Get a word from lexicon
    } while(word.length() != wordLength);

    ArrayList<Character> temp = new ArrayList<Character>(wordLength);
    for(int i = 0; i < wordLength; i++) {
        temp.add(word.charAt(i));
    }

    Collections.shuffle(temp);

    char[] result = new char[wordLength];
    for(int i = 0; i < wordLength; i++) {
        result[i] = temp.get(i);
    }
    return result;
}

我也对这种方法很好奇。如果有人有建议可以改进它,欢迎分享。基本上,该方法将从一个集合中提取一个长度为wordLength的单词,并返回打乱顺序的字符数组。与其获取已知长度的单词,我考虑根据单词长度将词汇表分成多个集合。
1个回答

12

是的,原始顺序可能会被保留,但正如你所说,对于更长的列表来说这是不太可能的。尝试一个只有两个元素的列表,就能看到这种情况发生。


1
当然,如果列表包含“重复项”,那么它也更有可能发生。 - Thilo
@Thilo 谢谢。重要的是将单词从原始顺序中洗牌,因此可能需要使用do while循环来重复洗牌,以防洗牌后的顺序与原始顺序相同。 - gh.
@gh: 是的,但这样做无法捕捉到洗牌后恰好成为字典中另一个单词的情况。比如 "BEAR" => "BARE"。你可以测试结果是否也在字典中,然后重复洗牌(或者更好的方法是选择一个新单词并重新开始)。 - Thilo
@Thilo 是的,你说得对,感谢你一直关注这个问题。然而,对于这个方法所属的程序来说,如果返回的是一个变位词,只要结果不是原始顺序就不是问题。 - gh.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接