2011-05-01 5 views
2

Java에서 2^21 임의의 고유 한 숫자 집합을 생성하는 데 사용할 수있는 알고리즘은 무엇입니까? 거기 math.random 제쳐두고 임의의 숫자를 생성하는 자바의 다른 라이브러리는 무엇입니까?Java에서 수백만 개의 반복되지 않는 난수 생성

미리 감사드립니다.

+0

어떤 크기의 샘플 공간에서? 분명히 2^21보다 큽니다 ... –

+0

세트가 구체화되고 고유해야하는 경우 1에서 2^21까지의 숫자가 뒤섞이는 것입니다 (많은 메모리가 필요할 것입니다). –

+3

고유 한 경우 그들은 없습니다 정말 무작위 야, 지금은? 목록을 검토 할 때 정확도가 증가하는 다음 번호를 예측할 수 있습니다. 범위가 세트의 크기에 의해 제한되는 경우 마지막 세트에서 100 % 가능한 정확성 예측이 있으며 이는 실제로 임의가 아닙니다! – corsiKa

답변

2

핵심 질문은 "숫자"에 의해 무엇을 MEEN 않습니다되어 한 번 봐? 일반적으로, 비록 이러한 문제가 해결 될 수

첫번째 부분이 두번째 부분은 해결 될 수 사소한 를 '번호 목록 생성, 그 제 2^21을, 임의의 순서로 그 넣어' 피셔 예이츠 알고리즘 매우 큰 숫자의 공간을 사용하려는 경우 진짜 문제입니다. 그런 다음 게으른 솔루션이 필요합니다.

여기에 내가 할 일은 다음과 같습니다. 데이터 구조를 사용하여 바깥 쪽은 배열처럼 보이지만 내부적으로 해시 테이블 기반의 희소 배열 표현을 사용하여 나타냅니다. 또한 셀에서 읽으려고 할 때 해시에서 무언가를 누르지 않으면 해당 셀의 색인 만 반환하면됩니다.

개조 된 피셔 예이츠는 index 변수 2^21에서 정지하고 (정수 개수)

이 지연 방식이 임의의 비 발생을 index 어레이의 "길이"사이의 임의의 변수 j 사용 O (n) 시간 및 O (n) 공간에서 임의의 종류의 번호를 반복하는 목록입니다. 여기서 n은 생성하려는 배열의 길이입니다. 그것이 당신이 할 수있는 최선의 방법입니다. 당신은 카운터를 암호화하는 Format-Preserving Encryption를 사용할 수 피셔 - 예이츠 http://en.wikipedia.org/wiki/Fisher-Yates_shuffle

0

에 대한 설명

. 카운터는 0부터 위쪽으로 이동하며 암호화는 선택한 기수를 사용하여 임의의 기수와 너비의 겉보기 임의의 값으로 변환합니다.

블록 암호는 일반적으로 고정 블록 크기를 갖습니다. 64 또는 128 비트. 그러나 Format-Preserving Encryption을 사용하면 AES와 같은 표준 암호를 사용하고 원하는 기수와 폭 (예 : 기수의 매개 변수에 기수 2, 폭 21)의 작은 너비 암호를 만들 수 있으며 알고리즘은 여전히 ​​사용 가능합니다 암호로 강건하다.

암호화 알고리즘이 1 : 1 매핑을 만들기 때문에 충돌이 발생하지 않습니다. 또한 가역성 (양방향 매핑)이기 때문에 결과 숫자를 가져 와서 시작한 카운터 값으로 돌아갈 수 있습니다.

AES-FFX이 목표를 달성하기위한 하나의 제안 된 표준 방법입니다.