임의의 수를 뽑는 랜덤 함수 사용법, 2001

@codemaru · October 22, 2011 · 3 min read

일반적으로 랜덤함수는 임의의 수를 뽑기 위해서 많이 사용합니다. 이러한 원리가 가장 많이 적용되는 부분이 아마도 게임일 겁니다. 게임에서 매번 같은 경로를 통해서 나타나지 않는 것이 바로 랜덤함수를 이용했기 때문입니다. 이러한 랜덤함수는 다음과 같은 형태로 사용할 수 있습니다.

int n = rand();

rand()함수는 임의의 정수를 리턴하게 됩니다. 하지만 이러한 식으로 뽑는 임의의 정수는 별로 큰 효용이 없습니다. 대부분의 경우는 정해진 범위 사이의 숫자를 뽑기 위해서 사용하는 일이 많습니다. 1에서 10 사이의 랜덤 숫자를 뽑기 위해서는 다음과 같이 하면 됩니다.

int n = rand() % 10 + 1;

보면 알겠지만 간단한 공식을 적용한 것입니다. n으로 나눈 나머지는 0에서 n-1까지 범위라는 점을 이용한 것이죠.. 따라서 다음과 같은 일반적인 식이 성립됩니다.

난수 = rand() % 범위 + 최소값;

그럼 실제로 이러한 랜덤함수를 어떤식으로 써먹는지 알아보도록 하겠습니다.

char *msg[3] = {"Jack", "Sam", "Linda"};
int n; 

srand(time(NULL));
n = rand() % 3;
printf("%s", msg[n]);

실행시킬때마다 다른 사람의 이름이 적히게 되는 소스입니다.

srand란 난수를 초기화 하는 함수입니다. 항상 rand를 하기 전에 한번쯤 해줘야하는 걸로 기억해 두시면 됩니다 [1]. 위의 식은 말그대로 현재 시간을 기준으로 난수를 뽑겠다는 말입니다. srand를 제비통을 섞는 함수 정도로 이해해 두시면 됩니다.

[1] srand는 위에 언급한대로 제비통을 섞는 일을 합니다. 따라서 전체 난수 세트를 리프레시할 필요가 있는 시점에만 사용해 주시면 됩니다. 참고로 시간을 기준으로 srand를 사용했고, 그 시점이 알려진다면 취약점이 될수도 있습니다. 왜냐하면 rand는 의사 난수를 발 생시키는 함수라 시드가 똑같으면 동일한 난수열을 생성하기 때문입니다.

@codemaru
돌아보니 좋은 날도 있었고, 나쁜 날도 있었다. 그런 나의 모든 소소한 일상과 배움을 기록한다. 여기에 기록된 모든 내용은 한 개인의 관점이고 의견이다. 내가 속한 조직과는 1도 상관이 없다.
(C) 2001 YoungJin Shin, 0일째 운영 중