NAME

random, srandom, initstate, setstate - 난수 생성기

SYNOPSIS

#include <stdlib.h>

long random(void);
void srandom(unsigned int seed);

char *initstate(unsigned int seed, char *state, size_t n);
char *setstate(char *state);

glibc 기능 확인 매크로 요건 (feature_test_macros(7) 참고):

random(), srandom(), initstate(), setstate():
_XOPEN_SOURCE >= 500
|| /* glibc 2.19부터: */ _DEFAULT_SOURCE
|| /* glibc <= 2.19: */ _SVID_SOURCE || _BSD_SOURCE

DESCRIPTION

random() 함수는 비선형 가산 피드백 난수 생성기를 사용하여 0에서 2^31 - 1까지 범위에서 연속으로 유사 난수를 반환한다. 생성기에서는 기본적으로 31개 정수 크기의 테이블을 사용한다. 이 난수 생성기의 주기는 아주 길다. 대략 16 * ((2^31) - 1)이다.

srandom() 함수는 그 인자를 random()이 새로 반환할 유사 난수 정수 열의 시드로 설정한다. 같은 시드 값으로 srandom()을 호출하여 그 정수 열을 반복할 수 있다. 시드 값을 제공하지 않으면 random() 함수에서 자동으로 1 값을 시드로 삼는다.

initstate() 함수를 이용하면 random()에서 사용하도록 상태 배열 state를 초기화 할 수 있다. initstate()에서는 상태 배열의 크기 n을 사용해 얼마나 복잡한 난수 생성기를 사용해야 할지 결정한다. 상태 배열이 클수록 난수가 더 좋아지게 된다. 상태 배열 크기 n에 대한 현재의 "최적" 값은 8, 32, 64, 128, 256바이트이다. 다른 양은 가장 가까운 정해진 양으로 내림 하게 된다. 8바이트보다 작게 사용하려 하면 오류가 발생한다. seed는 초기화를 위한 시드이다. 난수 열의 시작점을 나타내며 동일 지점에서 다시 시작할 수 있게 해 준다.

setstate() 함수는 random() 함수가 쓰는 상태 배열을 바꾼다. 다음 번 initstate() 내지 setstate() 호출 때까지 난수 생성에 상태 배열 state를 사용한다. stateinitstate()를 이용해 먼저 초기화 한 것이거나 이전 setstate() 호출의 결과여야 한다.

RETURN VALUE

random() 함수는 0에서 2^31 - 1 사이의 값을 반환한다. srandom() 함수는 아무 값도 반환하지 않는다.

initstate() 함수는 이전 상태 배열의 포인터를 반환한다. 실패 시 NULL을 반환하며 오류를 나타내도록 errno를 설정한다.

성공 시 setstate()는 이전 상태 배열의 포인터를 반환한다. 실패 시 NULL을 반환하며 오류를 나타내도록 errno를 설정한다.

ERRORS

EINVAL
setstate()에 준 state 인자가 NULL이었다.
EINVAL
initstate()에 8바이트보다 작은 상태 배열을 지정하였다.

ATTRIBUTES

이 절에서 사용하는 용어들에 대한 설명은 attributes(7)를 보라.

인터페이스 속성
random(), srandom(), initstate(), setstate() 스레드 안전성 MT-Safe

CONFORMING TO

POSIX.1-2001, POSIX.1-2008, 4.3BSD.

NOTES

동작이 재연 가능해야 하는 다중 스레드 프로그램에서는 random() 함수를 사용하지 말아야 한다. 그런 용도에는 random_r(3)을 사용하라.

난수 생성은 복잡한 주제이다. Numerical Recipes in C: The Art of Scientific Computing (William H. Press, Brian P. Flannery, Saul A. Teukolsky, William T. Vetterling; New York: Cambridge University Press, 2007, 3rd ed.) 7장 "Random Numbers"에서 난수 생성의 현실적 문제들을 탁월하게 논한다.

더 이론적인 논의와 함께 여러 현실적 사안들도 깊이 다루고 있는 곳이 Donald E. Knuth의 The Art of Computer Programming 2권(Seminumerical Algorithms) 2판(Reading, Massachusetts: Addison-Wesley Publishing Company, 1981)의 3장 "Random Numbers"이다.

BUGS

POSIX에 따르면 initstate()가 오류 시 NULL을 반환해야 한다. glibc 구현에서는 (명세된 대로) 오류 시 errno를 설정하기는 하지만 함수가 NULL을 반환하지는 않는다.

SEE ALSO

getrandom(2), drand48(3), rand(3), random_r(3), srand(3)


2021-03-22