0

d我有一个关于 Collections.shuffle() 方法的小问题。

案子:

我有 2 个需要改组的列表,然后将它们合并/合并到一个列表中,然后改组新的完整列表。我在 Random 类中使用了 shuffle 方法 - 使用 system.nanoTime() 作为种子。

代码如下所示:

public List<PresentationArticle> shuffleUnionShuffleLists(List<PresentationArticle> list1, List<PresentationArticle> list2) {
    shuffleList(list1);
    shuffleList(list2);

    List<PresentationArticle> resultList = //merge/union the two lists

    shuffleList(resultList);

    return resultList;
}

public void shuffleList(List<PresentationArticle> articleList) {
    long seed = System.nanoTime();
    Collections.shuffle(articleList, new Random(seed));
}

我的问题是:当这些方法在一个新的 Random 对象和一个新的(但几乎相同的)种子之后运行时,这是否是对列表进行适当的随机洗牌?

该方法shuffleUnionShuffleLists()大约每 3 分钟运行一次。

4

3 回答 3

2

默认种子基于 nanoTime 和一个计数器,因此它比您拥有的稍微随机一些。也没有必要洗牌不止一次。一旦它被随机化,不止一次就需要更长的时间。

因此,在您的情况下,您需要做的就是将两个列表添加在一起,然后使用 anew Random()或重用旧列表来打乱它。

public List<PresentationArticle> shuffleUnionShuffleLists(List<PresentationArticle> list1, List<PresentationArticle> list2) {
    List<PresentationArticle> list = new ArrayList<>(list1.size()+list2.size());
    list.addAll(list1);
    list.addAll(list2);
    Collections.shuffle(list);
    return list;
}

此外,通常最好不要修改传递给您的参数。

于 2013-09-11T13:11:20.570 回答
0

我没有理由在合并之前考虑对列表进行洗牌。随机化/洗牌两次不会使它们变得更加随机。

这将是列表的适当随机改组吗

是的,但你做的太多了。

于 2013-09-11T13:11:13.100 回答
0

首先,您通常不会为每次调用创建一个新的 Random 对象。它不会使它“更随机”。其次,洗牌几次也不会增加熵,所以只需要一次洗牌。

于 2013-09-11T13:11:44.790 回答