2009-11-07 4 views
1

유닉스 타임 스탬프를 적절하게 임의의 숫자로 바꾸는 알고리즘이 필요합니다. 따라서 타임 스탬프를 "재생"하면 동일한 난수를 얻을 수 있습니다.숫자 생성기가 아닌 의사 생성 시퀀스 생성기

그리고 여기에 내가 적절하게 의미하는 내용은 다음과 같습니다

  1. 대부분의 인간이 임의의 숫자에 루프 또는 패턴을 검색하지 않습니다.
  2. 암호로 보호 될 필요는 없습니다.
  3. 모든 숫자를 생성 할 수 있어야합니다.
  4. 숫자는 32 개 비트 정수

있습니다 그리고 나는 그것이 매우 빠르게 싶습니다 (나는 LFSR이 작업을 수행하지 않는 것으로 나타났습니다).

지금까지 제 아이디어는 PRNG를 반복해서 뿌리는 것입니다. 그러나 이것이 이것이 최선의 방법인지는 확실하지 않습니다.

어떤 생각이나 아이디어라도 높이 평가할 것입니다.

감사합니다.

+1

당신이 타임 스탬프의 순서를 변경하는 경우, 할 당신은 다른 순서로 같은 난수를 얻고 싶습니까? 예 : 한 쌍의 첫 번째 숫자가 타임 스탬프 인 경우 [(2,3), (3,9), (3,9)], [ (1,5)] 또는 [(2,7), (3,4), (1,6)]? – outis

+0

구조에 XKCD! - http://xkcd.com/221/ – JasCav

+0

좋은 지적으로, 이것은 prng와 해시를 구분할 것입니다. –

답변

2

통계적으로 랜덤 일 필요가없는 경우 타임 스탬프를 MD5에 공급하고 해시를 자릅니다. 주된 사안은 이것이 사교적 인 것이지 나는 모른다. 다른 해싱 알고리즘이 더 효과적 일 수 있습니다.

+0

임의의 숫자가 사람이 소비하는 것이면 해시 충돌을 신속하게 구분할 수 없습니다. MD4, MD5는 꽤 빠를 것입니다. –

+0

나는 해싱을 테스트하고 배포본이 어떻게 보이는지 살펴볼 것입니다. 나는 무작위적인 분포에 가까운 것을 원하지만, 만약 당신이 내 표류를 잡으면, 그렇게 가까이 있지 않아도된다. –

+0

다른 솔루션을 사용해도 똑같이 유용 할 수 있지만 앞서 사용 된 답변이므로이 답변을 승인 된 답변으로 표시했습니다. –

0

POSIX 호환 drand48() 제품군을 살펴 보는 것이 좋습니다. 이들은 괜찮은 (그러나 확실하게 암호화되지 않은) 난수를 제공하고 srand48()은 32 비트 시드 값을 사용합니다. 그것들은 결정 론적이기 때문에, 주어진 시드를 재사용하면 동일한 수열이 다시 생성됩니다.

+0

이전에 귀하의 답변을 보지 못했습니다. ('erand48/nrand48/jrand48 ')을 사용하는 것이'srand48 + (drand48/lrand48/mrand48)보다 더 직접적이다. – ephemient

+0

@ephemient : 가족 모두 다 :-) –

0

(timestamp^0x12345678) + 12345678 충분히 미묘합니까?

가역성에 신경 쓰지 않는다면 각 타임 스탬프를 crc32 할 수 있습니다.

1

가장 쉬운 방법은 시간을 jrand48으로 보내는 것입니다. 비슷해

#include <stdlib.h> 
int mix(int t) { 
    unsigned short x[3] = {t, t<<16, t}; 
    return jrand48(x); 
} 

그것의 가역적 (2 16 · X + n≡0x5deece66d · (2 ​​32 +1) · t의 +의 0xB로의 모드 2 48 ⇒의 t≡0xdfe05bcb1365 · (2 ​​16 · x + n-0xb) mod 2 여기서 n∈ [0,2))하지만 48 비트 중 32 비트이므로 실제로 그렇게 쉽지는 않습니다. (한 번도 더 xjrand48을 적용 할 수만큼 당신이 그것을 적용하지 않는 2 48 -1 번, 속성의 같은 종류의가 개최한다.)

+0

내가 가역성이 필요한지 아닌지를 알지 못합니다. 근본적으로 생성 된 숫자를 가져 와서 시드 (타임 스탬프)를 되찾고 있습니까? –

+0

예. 'x'를 48 비트로 처리하면'x = (2^32 + 1) * t'를 설정하고,'jrand48'은'0x5deece66d * x + 0xb'로 변경하고 상위 32 비트를 반환합니다. 역행렬을 계산하기 위해서 모듈러 산술 연산이 약간 필요합니다. 즉,'jrand48'의 출력에서 ​​원래의't'로 되돌아갑니다. 이것은 일반적으로 일반적이지는 않습니다 (32 비트 출력은 48 비트 상태를 결정하는 데 충분하지 않습니다). 그러나 32 비트 입력 만 있기 때문에 여기에 있습니다. – ephemient

+0

'16'보다는 '16'을 의미합니까? 당신이 가지고있는 것은 t의 하위 16 비트를 상위 16 비트로 이동시키고, 짧은 변환은 상위 16 비트를 버리므로 재미있는 방법으로 '{t, 0, t}'라고 쓰십시오. –