2013-05-02 8 views
1

시드를 사용하면 동일한 일련의 숫자를 계속해서 반복해서 뿌리기 위해 무작위 개체를 얻을 수 있습니다. 하지만 앱을 종료하고 다시 시작한 다음 중단 한 부분에서 계속해서 숫자를 뱉어 내고 싶다면 어떻게해야할까요? 동일한 씨드로 새로운 무작위를 시작하기 만하면 시퀀스가 ​​다시 시작됩니다.동일한 시드를 사용하여 두 번째 무작위 개체 시작하기

그럼 .. 임의로 만든 모든 전화 목록을 유지 관리하고 동일한 위치로 돌아 가기 위해 다시 호출하는 것 외에는 더 좋은 방법이 있습니까?

편집 : Zim-Zam은 객체를 다시 초기화하기 위해 Java 직렬화를 사용했지만 전체적으로 XML 인 저장 파일에는 하나의 Java 객체를 추가하고 싶지 않습니다.

+0

, 왜 당신이 그것을하고 싶은 것입니까? 프로그램이 처음으로 고유 한 (포기 또는 점유) 시드로 시작된 경우 이전의 임의의 연속 시퀀스에서 임의성 수준에 차이가없고 완전히 새로운 시퀀스가 ​​시작됩니다. – Cthulhu

+0

그래서 한 사용자가 자신의 사용에도 불구하고 다른 사용자와 동일한 방식으로 임의로 생성 된 콘텐츠를 사용하게됩니다. – Caustic

답변

1

오케이. 몇 가지 테스트를 거친 솔루션을 발견했다고 생각합니다.

임의 확장은 보호 된 메소드 next (int)에 대한 액세스를 제공합니다. 이것을 사용하여 임의의 위치를 ​​지정합니다. 그래서 nextFloat/nextInt/etc 메서드를 오버라이드하고 카운터를 증가시킴으로써. 동일한 시드와 카운트를 사용하여 새로운 무작위 객체를 초기화하고 next() 메서드를 호출하여 이전 인스턴스를 따라 잡을 수 있습니다. 잘 작동하는 것 같고 좋은 간단한 해결책입니다.

답변/의견을 보내 주신 분들께 감사드립니다.

2

개체를 ObjectOutputStream으로 serialize하여 상태를 저장할 수 있습니다. 프로그램을 다시 시작하면 ObjectInputStream으로 역 직렬화하고 Random은 중단 된 부분부터 시작합니다.

또는 copy-paste the Java Random source code을 자신의 MyRandom 생성기로; 이렇게하면 발전기의 내부 작동에 액세스 할 수 있으므로 상태를 저장하고 복원 할 수 있습니다.

+0

이것은 간단한 대답이지만 실제로는 완전히 XML 기반 인 데이터 구조에서 단일 Java 직렬화 된 객체를 사용하고 싶지 않습니다. 이 질문에 추가하겠습니다. – Caustic

+0

@Caustic 그 경우에는 위의 편집을 참조하십시오. –

+0

또 다른 좋은 생각이지만 조금 더 간단한 것에 대한 답을보십시오. – Caustic

0

또는 공상 직렬화 또는 매우 복잡한 클래스를 재정의, 왜 안 중 하나를하지 않으면 : 당신이 내 물어 신경 쓰지 않는 경우

Random mySaveableRandom = new Random(); 

long bookmark() { 
    long bookmark = mySaveableRandom.nextLong(); 
    mySaveableRandom.setSeed(bookmark); 
    return bookmark; 
} 
... 
void startFrom(long bookmark) { 
    mySaveableRandom.setSeed(bookmark); 
}