RANDOM(3)

명칭
random, srandom, srandomdev, initstate, setstate - 뛰어난 난수 제네레이터, 및 제네레이터를 변경하는 routine

프로그램 라이브러리
libc

서식
<stdlib.h> long random(void) void srandom(unsigned long seed) void srandomdev(void) char * initstate(unsigned long seed, char *state, long n) char * setstate(char *state)

해설
random() 함수는, 비선형 가법 피드백 난수 제네레이터를 사용해, 디폴트로 사이즈가 31 의, 롱 정수의 테이블을 채용해, 0 으로부터 (2**31)-1 까지의 범위에서 연속한 유사 난수를 되돌립니다. 이 난수 제네레이터의 주기는 매우 크고, 약 16*((2**31)-1) 입니다.

random() 함수와 srandom() 함수의 호출 순서와 초기화 프로퍼티는, rand(3) 함수와 srand(3) 함수의 것과 (대체로) 같습니다. 차이는, rand(3) 하지만 작성하는 랜덤시퀀스가 꽤 뒤떨어진 것인 것입니다. 실제, rand 가 작성하는 하위가 많은 비트는, 순환 패턴이 됩니다. random() 하지만 작성하는 비트는 모두 사용할 수 있습니다. 예를 들어 ‘random()&01’ 그럼, 랜덤인 바이너리치가 작성됩니다.

rand(3) (와)과 같이, random() (은)는 수치의 순차 순서를 디폴트로 작성합니다. 이 순차 순서는, 종을 ‘1’ (으)로 해 srandom() (을)를 호출하면(자) 재작성할 수 있습니다.

srandomdev() routine는, 암호화에서의 사용에 적절한 난수를 되돌린다 urandom(4) 난수 디바이스를 사용해, 상태 배열을 초기화합니다. 이 초기화 프로시저는, 어떠한 값으로 srandom() (을)를 호출해도 재작성할 수 없는 상태를 작성하는 것에 주의해 주세요. 상태 버퍼내가 연속하는 항은, 고정의 종의 경우에 적용된다 LC 알고리즘에서는 도출할 수 없기 때문입니다.

initstate() routine는, 인수로서 건네받은 상태 배열을, 후의 사용을 위해서(때문에) 초기화합니다. initstate() (은)는, 상태 배열의 사이즈 (바이트 단위)를 사용해, 난수 제네레이터의 복잡함을 결정합니다. 상태를 크게 하면(자), 난수의 질은 오릅니다. (현재로서는, 상태 정보의 양에 「최적」인 값은, 8 바이트, 32 바이트, 64 바이트, 128 바이트, 256 바이트입니다. 그 외의 값은, 가장 가까운 값에 인하할 수 있습니다. 8 바이트보다 작은 값을 사용하면(자) 에러가 됩니다. ) 초기화의 종 (난수 순차 순서의 개시점을 지정해, 같은 점으로부터 재개할 수 있다)도 인수입니다. initstate() 함수는, 이전 상태 정보 배열에의 포인터를 되돌립니다.

상태를 초기화하면(자), setstate() routine로 상태를 재빠르게 교체됩니다. setstate() 함수는, 이전 상태 배열에의 포인터를 되돌립니다. 인수인 상태 배열은, 다음에 initstate() 인가 setstate() (을)를 호출할 때까지, 한층 더 난수를 작성하는데 사용됩니다.

상태 배열을 초기화하면(자), initstate() (을)를 (목적의 종, 상태 배열, 사이즈로) 호출하는지, 혹은 (상태 배열을 지정했다) setstate() (와)과 (목적의 종을 지정했다) srandom() 의 양쪽 모두를 호출하는 것으로, 다른 점으로부터 재개할 수 있습니다. setstate() (와)과 srandom() 의 양쪽 모두를 호출하면(자), 상태 배열의 사이즈를 초기화한 다음에 기억할 필요가 없다 그렇다고 하는 장점을 얻을 수 있습니다.

상태 정보를 256 바이트로 하면(자), 난수 제네레이터의 주기는 2**69 보다 커집니다. 이 주기로는, 대부분의 목적으로 충분히 대응할 수 있습니다.

저자
Earl T. Cohen

진단
상태 정보를 8 바이트보다 작게 해 initstate() (을)를 호출하거나 상태 정보가 삐뚤어진 것을 setstate() 하지만 검출하거나 하면(자), 에러 메세지가 표준 에러 출력에 출력됩니다.

관련 항목
rand(3), srand(3), urandom(4)

역사
이 함수는, 4.2BSD 그리고 등장했습니다.

버그
처리 속도는, rand(3) 의 약 2/3 입니다.

낡은 실장에서는 초기화의 프로세스가 매우 약하고, 종을 이용해도 랜덤시퀀스는 그다지 바뀌지 않았습니다. 현재의 시스템은, 보다 좋은 유사 난수 제네레이터를 초기 상태의 산출에 채용하고 있습니다.