Collections.shuffle只工作一次

Chr*_*ien 3 java random collections shuffle

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

我有以下代码

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

它会随机播放一次,有或没有评论,但不会再次洗牌.这是一个GP算法(好吧,它的开始),我必须洗牌人口成员.

Den*_*ret 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);
}
Run Code Online (Sandbox Code Playgroud)

来自javadoc:

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

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