我有一种方法,在某些时候洗牌List
.重要的是我以后可以重现这个改组.为了实现这一点,我传递Random
给后来传递给的方法Collection.shuffle(List, Random)
.我期望使用相同的Random和相同的列表将导致相同的混洗列表,但显然我遗漏了一些东西.
使用String
s代替我的对象的示例代码:
@Test public final void shuffleTest() { Random random = new Random(555); Listtext = new ArrayList<>(); text.add("one"); text.add("two"); text.add("three"); text.add("four"); List shuffled = shuffleList(new ArrayList<>(text), random); List shuffled2 = shuffleList(new ArrayList<>(text), random); Assertions.assertThat(shuffled).isEqualTo(shuffled2); } private List shuffleList(List text, Random random) { Collections.shuffle(text, random); return text; }
我确实注意到,如果不是通过它Random
,我会传递种子,并且new Random(seed)
每次它确实有效,但我想避免这种情况.
如果你这样做:
Listshuffled = shuffleList(new ArrayList<>(text), new Random(555)); List shuffled2 = shuffleList(new ArrayList<>(text), new Random(555));
他们确实是平等的.
但是,您使用相同的随机实例两次:在第一次shuffle之后,Random
它处于与之前不同的状态,因此它将以不同方式对列表进行洗牌.