Collections.shuffle连续多次

时间:2013-09-11 12:54:08

标签: java collections shuffle

我对Collections.shuffle()方法有一点疑问。

案例:

我有2个列表需要随机播放,然后将它们合并/合并到一个列表中,然后随机播放新的完整列表。我使用了随机类的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分钟运行一次。

3 个答案:

答案 0 :(得分:2)

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

因此,在您的情况下,您需要做的就是将两个列表一起添加并使用new 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;
}

通常最好不要修改传递给你的参数。

答案 1 :(得分:0)

在合并之前,我没有理由想要对列表进行洗牌。随机化/随机播放两次不会使它们更随机。

  

这是否适当随机改组列表

是的但是你做得太多了。

答案 2 :(得分:0)

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