2013-04-08 2 views
3

이전 답변을 확인했지만 제대로 작동하지 않았습니다.Collections.shuffle once once once

나는 그것 또는 그것의 코멘트와 라인없이 한 번 섞고, 그러나 다시 셔플하지 않는 다음 코드

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의 인스턴스는 임의의 함수를 호출 할 때마다 상태가 변경되는 생성기입니다. 여기서 반환 된 숫자의 동일한 순서로 이어질 것이므로이 상태를 초기 시드 기반으로 재설정하지 않으려합니다. 그래서 각 셔플마다 새로운 인스턴스를 다시 만들고 싶지 않습니다.

+1

당신은 그들이'Random' 객체를 재사용해야한다고 말하고 있습니까, 아니면 문제는 (본질적으로) 그렇게하고 있다는 것입니까? 나는 어리 석고 무언가를 놓쳐 버린 것처럼 느껴지지만, 당신의 코드는 질문의 코드와 똑같은 결과를 얻는 것처럼 보입니다. –

+1

가난하게 말로 표현 되었기 때문에 편집했습니다. shuffle은 무작위 함수를 호출합니다. 각 무작위로 같은 무작위 객체를 다시 만들면 매번 동일한 순서로 작업을 수행하게됩니다. 개체를 한 번만 초기화하면 작업 순서가 다시 시작되지 않고 결과가 달라집니다. 이해해야 할 중요한 점은 임의 인스턴스 (생성자)에 상태가 있고 임의의 함수를 호출하면이 상태가 변경된다는 것입니다. –

+0

이제 훨씬 더 의미가 있습니다. 감사! –