난수가 필요하여, 다음과 같은 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));"로도 충분할 것이라 생각된다.
'Programing > C++' 카테고리의 다른 글
CMake, Visual Studio 2008, osgWorks 설치하기 (0) | 2013.05.19 |
---|---|
CMake, Visual Studio 2008, DCMTK 설치하기 (0) | 2013.05.19 |
Win 7, Visual Studio 2008, QT 4.84 설치하기 (0) | 2013.05.15 |
Boostpro 설치 - 윈도우즈 (0) | 2013.05.14 |
MSVCRTD.lib(crtexew.obj) : error LNK2019: unresolved external symbol _WinMain@16 referenced in function ___tmainCRTStartup (0) | 2011.03.09 |