본문 바로가기

Programing/C++

Random Function C++

난수가 필요하여, 다음과 같은 rand() 함수를 사용하였다.


#include <stdio.h>

void main()

{

int a;

for(int i = 0 ; i < 10; i++)

{

a = rand() % 10;    // (0 ~ 9까지 난수발생)

printf("%d", a);

}

}


하지만 이 때에 진정한 난수를 얻는 것이 아니다!!!

rand()함수를 사용하면 C언어에 있는 여러 개의 임의의 수가 나열되어 있는 난수표가 있는데 이를 가져오는 것이다.

이 때 동일한 난수표에서 동일한 위치에서 난수를 가져온다면, 항상 같은 값만 우리는 얻게 된다.

그래서 진정한 난수를 얻기 위해서 난수표와 위치를 항상 변경해야 하는데 이는 srand() 함수로 변경할 수 있다.

srand()를 사용할 때 ()안의 파라미터에 따라 난수표와 위치가 바뀌게 되는데,

결론은 파라미터 값을 항상 변경해야 하는 것이 필요하다.

그래서 흔히 시간데이터를 파라미터로 사용하는데, 이는 다음과 같다.


#include <stdio.h>

#include <time.h>

void main()

{

int a;

srand((unsigned)time(NULL));

for (int i = 0 ; i < 10; i++)

{

a = rand() % 10;    // (0 ~ 9까지 난수발생)

printf("%d", a);

}

}


"srand((unsigned)time(NULL));"을 통해 새로운 난수표에서 값을 얻을 수 있는 것을 확인할 수 있다.

이 때, 잊지 말아야 할 것은 시간 데이터를 이용하기 위해서, time.h라는 헤더 파일을 추가해야 한다.

그러면, 난수 초기화하는 "srand()"를 여러 번 실행하는 것이 효율적인지 않을 까라는 궁금증이 생길 수 있다.

결론만 말하면 초기화를 한 번 하든지 매 번 불러오던지 효과가 같기 때문에 굳이 여러번 불러 올 필요는 없다.

하지만 사용자가 구현한 상황에 의해 위와 같이 하여도 매 번 초기화 함수를 얻지 못할 때가 있다.

이 때에는 다음과 같이 사용하면 된다. 

 

#include <stdio.h>

#include <time.h>

void main()

{

int a;

srand(GetTickCount());

for (int i = 0 ; i < 10; i++)

{

a = rand() % 10;    // (0 ~ 9까지 난수발생)

printf("%d", a);

}

}


이 때 사용되는 "GetTickCount"는 시스템이 시작되서 실행 한 시간까지는 millisecond(1000분의 1초)단위로 리턴하는 함수이다.

개인적으로 "srand((unsigned)time(NULL));"로도 충분할 것이라 생각된다.