[C++]난수 생성기
※ 주의 ※ 작성된 지 오래된 글입니다.(2016.6) 이전 블로그에서 작성했던 글을 재가공한 것입니다. 출처는 하단에 표기했습니다.
C++에는 rand()라는 난수 생성 함수가 있다. rand() 함수를 호출하면 0에서 RAND_MAX까지의 정수 1개를 리턴한다. 난수들을 보면 결과값이 0~RAND_MAX 사이의 값이 나오므로 매우 큰 수들이 나오기도 한다. (RAND_MAX는 시스템마다 다르지만 2바이트로 나타낼 수 있는 32767보다 크다)
rand() 함수는 시드(seed)라는 값에 의해 생성되므로 이 시드를 선택해줘야 한다. 초기 시드값은 고정되어 있으며, 시드값을 가변값으로 따로 설정해주지 않으면 같은 시드값으로 실행이 되어 프로그램을 실행할 때 마다 같은 숫자가 나오는 불상사가 생기게 된다. 이를 해결하기 위해서 srand() 함수를 이용하여 시드값을 설정해준다. 일반적으로 프로그램 내에서는 srand() 함수르 한번만 불러주어도 충분하다.
srand() 함수 내에 값을 넣어주면 해당 값으로 시드가 설정되어 난수가 생성되는데, 같은 시드값으로 재실행을 하면 역시 같은 결과가 나온다. 프로그래머가 프로그램을 실행할 때 마다 시드값을 직접 지정을 할 수 없으므로 보통 srand()함수에 인자로 ctime 라이브러리의 time함수를 추가해준다.
예1)
srand((unsigned)time(NULL));
srand((unsigned int)time((time_t*)NULL));
예2) 시간 간격이 정밀함을 요구할 때 사용
srand(GetTickCount());
예3) 32비트 unsigned값이다 보니, 해당 방법은 약 7주후 오버플로우가 발생하게 된다.
srand(time(NULL));
값을 원하는 범위 내에서 나오게 하기 위해 modular연산을 이용한다.
- rand() % M을 하면 0 ~ (M-1)까지의 수가 생성
- rand() % M + N을 하면 N ~ (M+N-1)까지의 수가 생성
- rand() % 100이면 0~99까지의 수가 생성
- rand() % 100 + 1이면 1~100까지의 수가 생성
rand() % 100; // 0~99까지 난수 생성
rand() % 100 + 1; // 1~100까지 난수 생성
Leave a comment