Java 带有固定随机数的随机列表不会返回相同的结果

Java 带有固定随机数的随机列表不会返回相同的结果,java,collections,Java,Collections,我有一种方法,可以在某个时候洗牌列表。重要的是,我可以复制这个洗牌以后。为了实现这一点,我将Random传递给方法,然后将该方法传递给Collection.shuffle(List,Random)。我原以为对同一个列表使用相同的随机数会导致相同的无序列表,但显然我遗漏了一些东西 使用Strings而不是“我的对象”的示例代码: @Test public final void shuffleTest() { Random random = new Random(55

我有一种方法,可以在某个时候洗牌
列表
。重要的是,我可以复制这个洗牌以后。为了实现这一点,我将
Random
传递给方法,然后将该方法传递给
Collection.shuffle(List,Random)
。我原以为对同一个列表使用相同的随机数会导致相同的无序列表,但显然我遗漏了一些东西

使用
String
s而不是“我的对象”的示例代码:

    @Test
    public final void shuffleTest() {
        Random random = new Random(555);

        List<String> text = new ArrayList<>();
        text.add("one");
        text.add("two");
        text.add("three");
        text.add("four");

        List<String> shuffled = shuffleList(new ArrayList<>(text), random);
        List<String> shuffled2 = shuffleList(new ArrayList<>(text), random);
        Assertions.assertThat(shuffled).isEqualTo(shuffled2);
    }

    private List<String> shuffleList(List<String> text, Random random) {
        Collections.shuffle(text, random);
        return text;
    }
@测试
公开最终无效shuffleTest(){
随机数=新随机数(555);
列表文本=新的ArrayList();
正文。添加(“一”);
正文。添加(“两”);
增加(“三”);
正文。添加(“四”);
随机列表=随机列表(新的数组列表(文本),随机);
List shuffled2=shuffleList(新的ArrayList(文本),随机);
断言.assertThat(shuffled).isEqualTo(shuffled2);
}
私有列表随机列表(列表文本,随机){
集合。洗牌(文本,随机);
返回文本;
}

我确实注意到,如果不是传递
Random
,而是每次都传递种子并执行
newrandom(seed)
,但我想避免这种情况。

您自己提供了答案。初始化
Random
实例后,它将生成一系列伪随机数。第一次洗牌将消耗部分序列,因此第二次洗牌将使用序列的下一位。为了使用相同的序列,
Random
实例在每次洗牌之前必须处于相同的状态。具有相同种子的新实例符合要求。

如果您这样做:

List<String> shuffled = shuffleList(new ArrayList<>(text), new Random(555));
List<String> shuffled2 = shuffleList(new ArrayList<>(text), new Random(555));
List shuffled=shuffleList(新的ArrayList(text),新的Random(555));
List shuffled2=shuffleList(新的ArrayList(text),新的Random(555));
他们确实是平等的


但是,您将使用同一个随机实例两次:在第一次洗牌之后,
random
与之前处于不同的状态,因此它将以不同的方式洗牌列表。

第一次调用
Collections.shuffle(text,random)
将“使用”您传入的
random
实例中的一些随机数。只有当第一组随机数与第二组相同,并且您使用的
random
方式相同时,洗牌列表才会相同,只有当
random(555)
的第一组
n
数重复时才会发生这种情况

如果希望两个列表使用相同的随机数集进行排序,则必须给它们一个
random
,使用相同的种子,并使用相同数量的随机数(在本例中为0)

e、 g:

Random Random=新随机数(555);
随机列表=随机列表(新的数组列表(文本),随机);
随机=新随机(555);
List shuffled2=shuffleList(新的ArrayList(文本),随机);
...
Random random = new Random(555);
List<String> shuffled = shuffleList(new ArrayList<>(text), random);
random = new Random(555);
List<String> shuffled2 = shuffleList(new ArrayList<>(text), random);
...