Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Collections.shuffle连续多次_Java_Collections_Shuffle - Fatal编程技术网

Java Collections.shuffle连续多次

Java Collections.shuffle连续多次,java,collections,shuffle,Java,Collections,Shuffle,我有一个关于Collections.shuffle()方法的小问题 案例: 我有两个列表需要洗牌,然后将它们合并成一个列表,然后洗牌新的完整列表。我使用了随机类的shuffle方法——使用system.nanoTime()作为种子 代码如下所示: public List<PresentationArticle> shuffleUnionShuffleLists(List<PresentationArticle> list1, List<PresentationArt

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

案例:

我有两个列表需要洗牌,然后将它们合并成一个列表,然后洗牌新的完整列表。我使用了随机类的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));
}
public List shuffleUnionShuffleLists(列表列表1、列表列表2){
沙弗利斯特(列表1);
沙弗利斯特(名单2);
List resultList=//合并/合并两个列表
shuffleList(结果列表);
返回结果列表;
}
公共无效随机列表(列表文章列表){
长种子=System.nanoTime();
洗牌(文章列表,新随机(种子));
}
我的问题是:当方法紧跟在一起运行时,使用一个新的随机对象和一个新的(但几乎相同的)种子,这会是一个适当的列表随机洗牌吗


方法shuffleinonshufflelists()将大约每3分钟运行一次。

在合并之前,我没有理由对列表进行洗牌。将某个对象随机/洗牌两次不会使其变得更随机

这将是一个适当的随机洗牌的名单


是的,但是你做的太多了。

默认种子基于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;
}
public List shuffleUnionShuffleLists(列表列表1、列表列表2){
List List=newarraylist(list1.size()+list2.size());
list.addAll(列表1);
list.addAll(列表2);
集合。洗牌(列表);
退货清单;
}

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

首先,通常不会为每次调用创建新的随机对象。这并不意味着它“更随机”。其次,多次洗牌也不会增加熵,所以只需要一次洗牌。

这是什么语言?@RowlandShaw这是Java。我遗漏了一些关于联合/合并的细节。如果两个列表中的元素“太多”,它也会减少这两个列表。比如说外汇。列表1包含10个元素(我只想要5个,但我想要随机的5个元素),列表2包含20个元素(我只想要列表中的5个元素,但我想要随机的5个元素)。然后,在将列表合并/排序/减少为一个列表之前,我需要将列表1和列表2洗牌。这个列表我也希望随机,因此是第三次洗牌。所以基本上,我可以创建一个随机对象,将初始种子作为类中的属性,然后使用Random.nextInt();每次我都想洗牌吗?@MartinHansen是的,根本不需要使用一个以上的随机对象。幸运的是,我的公司给了我一个需要的任务。我也遗漏了一些信息——我只需要每个列表中数量有限的随机元素,然后将它们合并/排序/缩减到结果列表中。我需要在两个列表被添加到一起之前对它们进行洗牌——这并不重要。但是如果我仅仅通过使用shuffle(list)得到相同的随机性结果;那我就这样做。感谢您提供有关洗牌方法的信息。