로그인

검색

C/C++
2014.01.19 20:20

RAND_MAX

MoA
조회 수 1170 추천 수 0 댓글 2
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 게시글 수정 내역 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 게시글 수정 내역 댓글로 가기 인쇄
대부분의 랜덤넘버 제네레이터는 레머(Lehmer)가 고안한 다음과 같은 알고리듬을 통해서 난수를 순서대로(successively) 만들어냅니다.

X(i+1) = ( a * X(i) + c ) mode M

이러한 알고리듬을 따르는 난수 발생기를 congurential random number generator라고 부릅니다.
이때, (M-1)이 발생 가능한 최대의 난수가 되며,
a와 c는 난수발생기의 설계자가 정하는 값입니다.
또한 초기값 X(1)은 알고리듬 수행시마다 결정되는 초기 seed 값입니다. C로 프로그래밍할때는 srand()함수로 정해지는 것이 X(1)입니다.
다른 변종들이 있기는 하나, 기본적인 방법은 동일합니다.


이러한 방법으로 발생되는 랜덤넘버는 한가지 주요한 특징이 있는데, 발생되는 난수가 일정한 주기를 갖고 순환한다는 것이죠. 상수 a는 난수발생기의 주기를 결정하며, 상수 c는 하나의 난수와 다음 난수 사이의 격차가 얼마나 될지를 결정합니다. 이때 X(1)은 발생되는 수열의 순서를 결정합니다. 예를들어, a = 11, c = 1, m = 16으로 하고, X(1) = 0 으로 시드를 주면,
0, 1, 12, 5, 8, 9, 4, 13, 0, ...
으로 8의 주기를 가지고 같은 수열이 순환하게 됩니다. rand함수가 '근사적 난수pseudo-random number'를 '합동되게congurential' 발생한다는 것이 바로 이런 의미입니다. 원래 완전 난수는 발생 패턴을 예측할 수 없어야 하지만, rand함수가 반환하는 난수는 패턴을 예측할 수 있기 때문이죠.
또한 이 난수의 수열이 최소 0에서 최대 m-1 까지의 범위를 가지기는 하지만, m개의 수가 모두 포함되지는 않습니다. 0부터 m-1까지중 일부의 수만 난수로 발생할 뿐이지요.

이러한 문제를 해결하기 위해 congurential random number generator중에서 c = 0인 경우, 즉 난수 발생기가 사용하는 식이 다음과 같은 난수 발생기를 multiplicative congurential random number generator라고 부릅니다. 
X(i+1) = ( a * X(i) ) mode M

MC난수발생기는 X(1)이 0이 아니라면 1부터 M-1까지의 모든 수가 주기 M-1을 가지고 순차적으로 순차적으로 반환됩니다. 예를들어, a=6, m=13, X(1) = 1이라면,
1, 6, 10, 8, 9, 2, 12, 7, 3, 5, 4, 11, 1, ...
의 순서로 주기가 12인 수열로 난수가 발생됩니다.

따라서 질문하신 내용에서, 주기가 232라는 말은 위의 수식에서 a= 232라는 말이 되며, M-1이 바로 RAND_MAX로 정의된 상수입니다.
대부분의 시스템에서 M은 2^16으로 정의되어 M = 32768로 사용하며, 이때 RAND_MAX는 M-1 = 32767이 됩니다.


도움말의 좀더 정확한 번역은 다음과 같습니다.
==========================================================================
rand uses a multiplicative congruential random number generator with period 232 to return successive pseudo-random numbers in the range 0 to RAND_MAX. 

RAND_MAX :Maximum value returned by rand function. 


rand함수는 232의 주기를 가지는 곱셈기반의 합동난수 발생장치를 사용하여 0부터 RAND_MAX의 범위 내에서 근사난수를 순서대로 반환한다.

RAND_MAX : rand함수가 리턴하는 최대값
?
  • ?
    수강생 2015.04.17 19:07
    실례지만 뭐좀여쭤보고싶은게있는데 연락수단이없어 댓글남깁니다. 메일주소 알려주실수있는지요
  • profile
    MoA 2015.05.22 14:45
    늦게 봤네요. 메일 주소는 vfinger at 네이버 입니다.

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
공지 Tool/etc Programming 게시판 관련 2 MoA 2014.11.01 5308
188 Algorithm 2048게임 높은 점수 얻기 위한 알고리즘 MoA 2014.03.29 1278
187 Tool/etc UI Guidelines MoA 2014.03.11 1365
186 Tool/etc 자바스크립트 물리엔진 ㄷㄷ MoA 2014.03.10 1083
185 API/MFC 다이얼로그 기반에서 메뉴 내용이 갱신 안되는 문제 해결 MoA 2014.02.13 1518
184 Python 파이썬에서 C모듈 사용하기 MoA 2014.02.10 2544
183 Library CSpreadSheet MoA 2014.02.03 854
182 Reversing 워게임 사이트 정리 MoA 2014.01.27 1710
» C/C++ RAND_MAX 2 MoA 2014.01.19 1170
180 Python OpenCV 이용한 템플릿 매칭 MoA 2014.01.16 2076
179 Tool/etc Quake 3 source code and review MoA 2014.01.15 940
178 Python 화면 캡쳐 소스 MoA 2014.01.14 1381
177 C/C++ __FILE__ __LINE__ __FUNCTION__ 등 매크로 MoA 2014.01.02 1502
176 Tool/etc 유용한 라이브러리 소개 MoA 2013.12.27 1612
175 Python Embedding Python in C/C++ MoA 2013.12.23 908
174 Python SciPy and NumPy MoA 2013.12.23 1178
173 API/MFC 다국어를 위한 StringTable, LoadString 1 MoA 2013.12.22 3284
172 API/MFC WTL 정리 file MoA 2013.12.22 1883
171 API/MFC GetLastInputInfo 함수 MoA 2013.12.06 986
170 Python [GUI] wxPython에서 에러메시지 콘솔로 보는 법 MoA 2013.12.03 1325
169 Python [GUI] wxPython 기본 프로그램 file MoA 2013.11.30 1411
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 15 Next
/ 15