我检查了之前的答案,但它对我不起作用。
我有以下代码
public static void createPopulation(ArrayList<City> city)
{
for (int i = 0; i<gen.getSize(); i++) {
ArrayList<City> copy = new ArrayList<City> (city); //added from previous question
Collections.shuffle(copy, new Random(seed));
gen.add(copy);
}
}
它有一次洗牌,有或没有评论的线,但不会再次洗牌。这是一个GP算法(好吧,它的开始),我必须改组人口成员。
答案 0 :(得分:10)
那是因为你重新创建了Random
对象。
这样做:
Random r = new Random(seed);
for (int i = 0; i<gen.getSize(); i++) {
ArrayList<City> copy = new ArrayList<City> (city); //added from previous question
Collections.shuffle(copy, r);
gen.add(copy);
}
来自the javadoc:
如果使用相同的种子创建了两个Random实例,那么 为每个方法调用相同的方法调用,它们将生成和 返回相同的数字序列。
Random
的实例是一个生成器,每次调用其上的随机函数时,其状态都会更改。在这里,您不希望将此状态重置为基于初始种子的状态,因为这会导致返回的数字序列相同。这就是为什么你不想为每次改组重新创建一个新实例。