메뉴 건너뛰기

OBG

Programming

C/C++
2014.01.19 20:20

RAND_MAX

MoA
조회 수 397 추천 수 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 1714
166 Python [첫게임 만들기] 8. Win or Lose file MoA 2013.11.21 421
165 Python [첫게임 만들기] 7. 게임 정보 표시 file MoA 2013.11.21 1035
164 Python [첫게임 만들기] 6. 적을 해치우자 1 file MoA 2013.11.21 488
163 Python [첫게임 만들기] 5. 적을 생성하자 file MoA 2013.11.21 409
162 API/MFC Simple Add-On Wait Dialog in MFC MoA 2013.11.21 420
161 Python [첫게임 만들기] 4. 화살을 발사해보자 file MoA 2013.11.21 676
160 Python [첫게임 만들기] 3. Bunny를 회전시키자 file MoA 2013.11.21 1010
159 Python [첫게임 만들기] 2. 배경 그리기, Bunny 움직이게 하기 file MoA 2013.11.21 455
158 Python [첫게임 만들기] 1. 게임 소개 및 실습 준비 1 file MoA 2013.11.20 910
157 Python 고양이 밖으로 못나가게 하기 file MoA 2013.11.10 630
156 Python 고양이 움직이기 1 file MoA 2013.11.08 841
155 Site CSS, 자바스크립트 강좌 MoA 2013.11.05 388
154 API/MFC 슬라이더 컨트롤에 툴팁 삽입 (동적 툴팁) MoA 2013.10.28 629
153 API/MFC 태스크 대화상자 (Task Dialog) MoA 2013.10.22 436
152 API/MFC 프린터 출력하기 MoA 2013.10.16 3437
151 Tool/etc Flash CS5 and Version Control MoA 2013.10.11 347
150 Library AS3 Code Library MoA 2013.10.11 5030
149 Site 영상 처리 관련 블로그 MoA 2013.09.29 346
148 Tool/etc [S/W 공학] 월-인원(man-month), LOC MoA 2013.09.23 521
147 Site 졸업작품 및 각종 과제물 프로그램은 어떻게 만들어야 하나? (윈도우즈 응용프로그램) MoA 2013.09.10 1644
Board Pagination Prev 1 ... 2 3 4 5 6 7 8 9 10 11 ... 15 Next
/ 15
위로