본문 바로가기

C언어 자습/혼자공부하는 C언어 (저자 서현우)

난수 생성하기

난수를 사용하려면 2가지 헤더파일이 추가로 필요하다.

#include<time.h>
#iclude<stdlib.h>

위 두가지 헤더파일로 난수 생성이 가능하다.

time.h파일은 시간관련 함수를 모아 놓은 헤더파일이고, stdlib.h파일은 난수 생성과 문자열 변환 등을 수행하는 함수들을 모아 놓은 헤더파일입니다.

 

rand()함수로 난수를 뽑는 방법

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int main() {
	printf("%d\n", rand());
	printf("%d\n", rand());
	printf("%d\n", rand());
	printf("%d\n", rand());
	printf("%d\n", rand());
	printf("%d\n", rand());
	printf("%d\n", rand());
	printf("%d\n", rand());
}

rand() 함수로 난수를 생성할 수 있으나, 값이 계속 동일하게 나옵니다.

 

난수를 생성하기 전에 난수를 초기화 해야 합니다. 난수를 초기화 하는 문장은 아래와 같습니다.

srand(time(NULL));

위 코드를 난수를 생성하기 전에 항상 추가해 주어야 실행할 때마다 다른 난수값을 얻을 수 있습니다.

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int main() {
	srand(time(NULL));
	printf("%d\n", rand());
	printf("%d\n", rand());
	printf("%d\n", rand());
	printf("%d\n", rand());
	printf("%d\n", rand());
	printf("%d\n", rand());
	printf("%d\n", rand());
	printf("%d\n", rand());
}

실행해보면 실행할 때마다 난수가 달라집니다.

 

그러면 본인이 원하는 난수의 범위를 정하려면 어떻게 해야 할까요?

나머지를 구하는 연산자를 사용하면 됩니다. 바로 % 입니다.

 

 

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int main() {
	srand(time(NULL));
	for (int i = 1; i <= 10; i++) {
		for (int j = 1; j <= 10; j++) {
			printf("%d\n", rand() % i);
		}
		printf("\n");
	}
}

위 코드는 2중 반복문입니다. 표로 만들어 정리해보면

반복횟수 i값 j값 출력 예상 결과
1 1 0~9 까지 10번 반복함 rand() % 1 를 10번 출력
2 2 0~9 까지 10번 반복함 rand() % 2 를 10번 출력
3 3 0~9 까지 10번 반복함 rand() % 3 를 10번 출력
4 4 0~9 까지 10번 반복함 rand() % 4 를 10번 출력
5 5 0~9 까지 10번 반복함 rand() % 5 를 10번 출력
6 6 0~9 까지 10번 반복함 rand() % 6 를 10번 출력
7 7 0~9 까지 10번 반복함 rand() % 7 를 10번 출력
8 8 0~9 까지 10번 반복함 rand() % 8 를 10번 출력
9 9 0~9 까지 10번 반복함 rand() % 9 를 10번 출력
10 10 0~9 까지 10번 반복함 rand() % 10 를 10번 출력

 

일단 첫 루프문에서 알 수 있죠. 모든 정수를 1로 나누면 나머지가 0이기 때문에 0만 출력 됩니다.

그리고 나누는 수가 n 이라고 할 때 나머지는 항상 n보다 작습니다.

어떤 정수를 3으로 나눈다고 할 때 나머지가 3이 나올 수는 없죠. 나머지는 항상 0이거나 1이거나 2이거나 셋중 하나일 겁니다.

난수 생성에서도 똑같이 적용 할 수 있습니다.

 

본인이 원하는 수의 범위가 있다면 해당 범위보다 하나씩 증가 시켜야 겠네요.

만약 1부터 6까지의 난수를 원한다면

rand() % 6+1 의 형태를 사용하면 되겠죠.

 

3부터 6까지(6포함) 난수를 원한다면 어떻게 하면 될까요?

먼저 난수를 생성하고, 더했을 때 3~6이 되게 만들면 됩니다.

rand() % 4 + 3 의 형태입니다.