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);
...