3

我检查了以前的答案,但它对我不起作用。

我有以下代码

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 算法(嗯,它的开始),我必须在其中洗牌人口的成员。

4

1 回答 1

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

javadoc

如果使用相同的种子创建 Random 的两个实例,并且为每个实例进行相同的方法调用序列,它们将生成并返回相同的数字序列。

的一个实例Random是一个生成器,每次调用它的随机函数时,它的状态都会改变。在这里,您不想将此状态重置为基于初始种子的状态,因为这会导致相同的返回数字序列。这就是为什么您不想为每次改组重新创建一个新实例的原因。

于 2013-04-08T12:04:48.473 回答