2013-04-08 185 views
3

我查了以前的答案,但它不適合我。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); 
    } 
} 

這一次洗牌,有或沒有與它註釋的行,但不會再次洗牌。這是一個GP算法(好吧,它的開始),我必須洗牌的人羣。

+0

什麼是'種子'?當你從相同的種子值創建一個新的「Random」時,它會每次給你相同的「隨機」數字序列。 – 2013-04-08 12:06:37

回答

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的一個實例是一個發生器,每當你調用一個隨機函數時它的狀態就會改變。在這裏你不想重置這個狀態到基於種子的初始狀態,因爲這會導致返回數字的相同序列。這就是爲什麼你不想爲每個洗牌重新創建一個新的實例。

+1

你是說他們應該重用'Random'對象,或者問題是他們(基本上)是這樣做的?我覺得我一定很愚蠢並且錯過了一些東西,但是你的代碼在我看來會像導致與問題中的代碼完全一樣。 – 2013-04-08 12:12:31

+1

我編輯,因爲它措辭不佳。 'shuffle'調用隨機函數,如果爲每個隨機重新創建相同的Random對象,則每次都執行完全相同的操作序列。如果僅初始化對象一次,則操作順序不會重新啓動,結果也會不同。要理解的重要一點是Random實例(generator)具有一個狀態,並調用其上的任意隨機函數來改變此狀態。 – 2013-04-08 12:20:51

+0

這使得現在更有意義。謝謝! – 2013-04-08 12:24:07