目次
1. C 언어에서 난수 생성 방법: rand 함수
1.1 rand 함수란?
rand()
함수는 C 언어에서 의사 난수를 생성하기 위한 함수입니다. 의사 난수란 미리 정해진 알고리즘으로 생성되는 수열이며, 진정한 난수는 아니지만 일반적인 용도에는 충분합니다. rand()
는 0부터 32767까지 범위의 정수를 반환합니다【8†source】. 이 범위는 시스템에 따라 다를 수 있지만, 일반적으로는 이 값입니다.1.2 rand 함수의 기본적인 사용법
rand()
함수를 사용하려면 stdlib.h
를 포함해야 합니다. 아래 코드는 rand()
함수를 사용해 난수를 생성하는 기본 예제입니다.#include <stdio.h>
#include <stdlib.h>
int main(void) {
int randomNumber = rand();
printf("생성된 난수: %d
", randomNumber);
return 0;
}
이 코드를 실행하면 0부터 32767 사이의 난수가 표시됩니다. 다만, 이렇게 하면 매번 같은 난수가 생성되는 단점이 있습니다. 이에 대해서는 뒤에서 설명합니다.
2. 난수 범위를 조정하는 방법
2.1 나머지를 사용하여 범위를 제한하는
난수를 생성할 때, 특정 범위 내의 값이 필요할 경우가 자주 있습니다. 예를 들어, 1부터 100까지의 난수를 생성하고 싶을 경우,rand()
함수의 출력에 대해 나머지 연산자 %
를 사용하여 범위를 조정할 수 있습니다.int numberInRange = rand() % 100 + 1; // 1부터 100까지의 난수를 생성
이 예에서는, rand()
의 출력을 100으로 나눈 나머지를 얻고, 거기에 1을 더함으로써 1부터 100까지의 난수를 생성합니다. 나머지를 사용함으로써, 쉽게 원하는 범위의 난수를 생성할 수 있습니다【8†source】.2.2 범위를 지정한 난수 생성
보다 유연하게 난수의 범위를 지정하고 싶을 경우, 함수를 만들어 사용할 수도 있습니다. 아래는 임의의 최소값과 최대값 범위 내에서 난수를 생성하는 함수의 예시입니다.int getRandomNumber(int min, int max) {
return rand() % (max - min + 1) + min;
}
이 함수를 사용함으로써, getRandomNumber(1, 100)
와 같이 임의의 범위 내에서 난수를 생성할 수 있습니다.3. srand 함수로 난수 패턴을 바꾸기
3.1 srand 함수란?
rand()
함수를 그대로 사용하면, 프로그램을 실행할 때마다 같은 난수 패턴이 생성됩니다. 이는 의사 난수의 특성으로 디버깅에는 편리하지만, 실용적인 난수가 필요할 경우 문제가 됩니다. 따라서 srand()
함수를 사용하여 난수의 시드(시드)를 설정하고, 생성되는 난수 패턴을 바꿀 수 있습니다【7†source】【9†source】。3.2 srand 함수 사용법
srand()
함수는 rand()
함수 앞에 호출하여 난수의 시드를 지정합니다. 보통 srand((unsigned int)time(NULL))
를 사용해 현재 시간을 시드로 지정합니다。#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void) {
srand((unsigned int)time(NULL)); // 현재 시간을 시드로 설정
int randomNumber = rand();
printf("Generated random number: %d
", randomNumber);
return 0;
}
이 코드에서는 srand()
에 의해 매번 다른 난수 패턴이 생성됩니다. time(NULL)
은 현재 시간을 초 단위로 반환하므로, 매번 다른 시드를 설정할 수 있습니다。
4. 난수 활용 예시
4.1 게임에서의 난수 활용
난수는 게임 개발에서 자주 사용됩니다. 예를 들어, 캐릭터의 위치를 무작위로 설정하거나 아이템의 등장 확률을 정할 때 사용됩니다. 아래는 주사위를 굴리는 시뮬레이션 예시입니다.#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void) {
srand((unsigned int)time(NULL)); // 시드 설정
int diceRoll = rand() % 6 + 1; // 1부터 6까지의 난수를 생성
printf("주사위 굴림: %d
", diceRoll);
return 0;
}
이 프로그램은 1부터 6까지의 무작위 숫자를 생성하여 주사위 눈으로 출력합니다. 난수를 활용함으로써 게임에서 예측 불가능한 요소를 쉽게 구현할 수 있습니다.4.2 몬테카를로 방법에 의한 시뮬레이션
난수는 또한 몬테카를로 방법과 같은 시뮬레이션에도 활용됩니다. 몬테카를로 방법은 난수를 사용하여 해석적으로 구하기 어려운 문제의 해를 근사하는 기법입니다. 예를 들어, 난수를 이용해 원주율 π 값을 근사할 수 있습니다【9†source】.#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void) {
int n_trials = 1000000;
int n_inside = 0;
double x, y, pi;
srand((unsigned int)time(NULL));
for (int i = 0; i < n_trials; i++) {
x = (double)rand() / RAND_MAX;
y = (double)rand() / RAND_MAX;
if (x * x + y * y <= 1) {
n_inside++;
}
}
pi = 4.0 * n_inside / n_trials;
printf("근사된 π: %f
", pi);
return 0;
}
이 프로그램은 무작위 점을 사용하여 원주율을 근사하는 몬테카를로 방법의 예시입니다. rand()
를 사용해 0부터 1 범위의 난수를 생성하고, 이를 이용해 원의 면적을 근사합니다.
5. rand 함수와 srand 함수의 주의점
5.1 의사 난수의 이해
C 언어의rand()
함수가 생성하는 난수는 의사 난수입니다. 진정한위 값이 아니라 내부 알고리즘에 기반해 계산되므로, 같은 시드를 사용하면 동일한 난수 패턴이 생성됩니다. 이는 디버깅 시에 편리하지만, 완전한 무작위성이 필요한 경우에는 적합하지 않습니다.5.2 흔히 발생하는 실수
난수를 사용할 때 일반적인 실수로는srand()
를 사용하지 않거나, rand()
의 출력 범위를 오해하는 경우가 있습니다. 특히 rand()
를 사용하기 전에 반드시 srand()
로 시드를 설정하지 않으면 매번 동일한 패턴의 난수가 생성됩니다. 또한 rand() % n
으로 범위를 조정할 경우, n
의 값이 의도한 것과 다른 결과를 초래할 수 있으므로 주의가 필요합니다.결론
C 언어에서의 난수 생성은 게임이나 시뮬레이션 등 다양한 분야에서 활용되고 있습니다. <coderand() 함수와srand()</ 함수의 사용법을 이해하고, 적절히 난수를 생성함으로써 프로그램에 예측 불가능한 요소를 추가할 수 있습니다. 이 글을 참고하여, 꼭 난수를 활용한 프로그램을 만들어 보세요.