메뉴 건너뛰기

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 1708
» C/C++ RAND_MAX 2 MoA 2014.01.19 397
105 Reversing 워게임 사이트 정리 MoA 2014.01.27 1277
104 Library CSpreadSheet MoA 2014.02.03 371
103 Python 파이썬에서 C모듈 사용하기 MoA 2014.02.10 1919
102 API/MFC 다이얼로그 기반에서 메뉴 내용이 갱신 안되는 문제 해결 MoA 2014.02.13 955
101 Tool/etc 자바스크립트 물리엔진 ㄷㄷ MoA 2014.03.10 613
100 Tool/etc UI Guidelines MoA 2014.03.11 516
99 Algorithm 2048게임 높은 점수 얻기 위한 알고리즘 MoA 2014.03.29 547
98 Python [게임 만들기] 강좌 진행 예정 2 MoA 2014.04.26 1463
97 Python [농장게임 만들기] 1. Nubcake Farms 게임 소개 4 file OBG 2014.04.26 1588
96 Python [농장게임 만들기] 2. Nubcake Farms 클래스 분석 3 file OBG 2014.04.26 715
95 Python [농장게임 만들기] 3. 배경을 그리자 6 file MoA 2014.04.28 2066
94 Python [농장게임 만들기] 4. 펜스를 그리자 5 file MoA 2014.04.30 602
93 Python [농장게임 만들기] 5. 플레이어를 추가하자 1 file MoA 2014.04.30 532
92 Python [농장게임 만들기] 6. 나머지 오브젝트를 그리자 1 file MoA 2014.05.01 758
91 Python [농장게임 만들기] 7. 농부 행동 추가 1 file MoA 2014.05.01 528
90 Python [농장게임 만들기] 8. HUD에 텍스트를 표시하자 file MoA 2014.05.01 677
89 Python [농장게임 만들기] 9. 밀을 재배하자 file MoA 2014.05.01 640
88 Python [농장게임 만들기] 10. 상점을 추가하자 file MoA 2014.05.01 2671
87 Python [액션게임 만들기] 1. Street Pyghter 게임 소개 3 file OBG 2014.05.03 890
Board Pagination Prev 1 ... 5 6 7 8 9 10 11 12 13 14 ... 15 Next
/ 15
위로