Collections.shuffle只工作一次

时间:2013-04-08 12:03:23

标签: java collections random 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);
    }
}

它有一次洗牌,有或没有评论的线,但不会再次洗牌。这是一个GP算法(好吧,它的开始),我必须改组人口成员。

1 个答案:

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