我对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分钟运行一次。
答案 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对象。它不会使它“更随机”。其次,改组几次也不会增加熵,所以只需要一次洗牌。