2012-09-05 2 views
-1

고유 한 요소의 임의의 개수를 생성해야하는 컬렉션 [1, 2, 3, 4, 5, 6, 7, 8,9]이 있습니다. 5, 3, 7, 9, next time : 4, 8. 내 함수는 잘 작동하지만, 난수를 생성하고 이미 중복이 없는지 검사하는 함수에 대한 재귀 호출 때문에 StackOverflowError가 throw되는 경우가 있습니다. 나는 이것이 어떻게되는 것을 막을 수 있는지 궁금합니다.StackOverflowError 및 난수

+3

관련 코드를 게시하십시오. – kosa

+0

[이 링크] (http://stackoverflow.com/questions/11842533/generating-random-unique-data-takes-too-long-and-eats-100-cpu) 도움이 될 것 같아요. 이전에 비슷한 문제에 직면 했었습니다. 하지만 일부 코드를 게시해야한다고 생각합니다. –

+0

[StackOverflowError 란 무엇입니까?] (http://stackoverflow.com/questions/214741/what-is-a-stackoverflowerror)의 가능한 복제본 – Raedwald

답변

1

재귀를 사용하지 않고이 작업을 수행해야합니다. 더 잘 작동 할 수 알고리즘의 거친 스케치 :

  1. 배열
  2. 에 목록을 변환 소스 배열을 통해 이동하고 목록
  3. 에 50 %의 확률로 각 요소를 추가 빈 목록을 만듭니다 배열에
  4. 사용 Arrays.shuffle()는 무작위 요소 작업을 수행해야합니다

순서를 변경합니다.

1

하나의 솔루션은 재귀가 아닌 반복 (for 또는 while 루프)을 사용하는 것입니다.

다른 해결책은 컬렉션의 변경 가능한 복사본을 만드는 것부터 시작하여 컬렉션에서 요소를 선택할 때마다 요소를 제거하여 다시 선택의 위험이 없습니다. 그러나 컬렉션의 실제 사본 (예 : new ArrayList<Integer>(originalCollection))을 만들어 원본에서 요소를 제거하지 않도록하십시오.

0

전체 목록의 각 요소는 특정 요소 모음에 있거나 존재하지 않습니다. 바이너리를 사용하라는 말입니다.

0b000000000은 [] 즉 모든 숫자가 없음에 매핑됩니다.

0b111111111은 [1, 2, 3, 4, 5, 6, 7, 8, 9] 즉 모든 숫자가 매핑됩니다.

2 진수로 처리되는 두 숫자 사이의 숫자는 전체 모음의 하위 집합으로 매핑됩니다.

0b001010101 [3, 5, 7, 9]의 범위

각각 이진수 고유 한 서브 세트로 매핑 할 매핑. 귀하의 예는 주문이 중요 할 수 있음을 암시합니다. 그렇다면 별도로 처리해야합니다. 이 방법은 최대 2^9 = 512 개의 다른 조합을 제공합니다.