프로그램을 만들다보면 숫자를 랜덤으로 만들어내야 할 때가 있습니다. 이번 포스팅은 C언어와 C++에서 랜덤으로 숫자를 추출하는 방법과 여러 예제를 살펴보겠습니다.
1. rand 함수의 기본 사용 방법
rand 함수를 사용하면 랜덤으로 숫자를 출력할 수 있습니다.
함수 원형은 아래와 같습니다.
int rand(void)
#include<stdlib.h>로 stdlib.h 헤더파일에 해당 선언이 적혀있습니다.
해당 함수는 0 부터 32767까지의 숫자 중 하나를 랜덤으로 뽑아냅니다.
여기에 % 연산자를 사용하여 원하는 숫자의 범위를 정합니다.
예를들어 rand() % 10 을 하면 0부터 9까지의 숫자중 하나가 나오게 됩니다.
만약 5부터 10까지의 숫자 중 를 랜덤으로 추출하고 싶다면
rand() % 6 + 5 를 하면 됩니다. rand() % 6 을 하면 0부터 5까지의 숫자 중 하나이고 거기에 +5를 하면 5부터 10까지의 숫자중 하나가 됩니다.
이렇게 하면 자신이 원하는 숫자를 랜덤으로 추출할 수 있습니다.
아래 사용예제 입니다. 0부터 99까지의 숫자중 랜덤으로 변수 num에 저장하여 출력합니다.
총 3번을 반복합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 | #include <stdio.h> #include <stdlib.h> void main() { int num; num = rand() % 100; printf("rand : %d\n", num); num = rand() % 100; printf("rand : %d\n", num); num = rand() % 100; printf("rand : %d\n", num); } | cs |
- 출력결과 -
rand : 41
rand : 67
rand : 34
2. srand 함수를 사용하여 프로그램을 실행할 때마다 다른 난수 출력하기
하지만 이상한 것은 프로그램을 실행 할 때마다 매번 같은 숫자가 나오게 됩니다.
이것은 프로그램을 실행할 때마다 항상 난수표에 같은 지점에서부터 숫자를 추출하기 때문입니다.
난수표라는 것은 글 가장 마지막에 설명을 써놓았습니다.
그래서 프로그램을 실행할 때마다 숫자가 다르게 나오게 하고 싶다면 srand 함수를 이용해야 합니다.
아래 함수의 원형 입니다.
void srand( unsigned int seed );
seed값을 받아 난수표에 시작 지점을 바꾸는 것 입니다. 보통은 seed로 현재의 시간을 unsigned int 로 변환하여 사용하게 됩니다. 그러면 프로그램을 시작하는 시간이 계속 달라지기 때문에 프로그램을 실행할 때마다 다른 수가 추출되게 됩니다.
srand 함수를 사용하기 위해서는 #include<time.h>를 추가하여야 합니다.
아래 사용예제 입니다. 위의 예제와 같지만 프로그램이 시작할때 scanf() 를 사용합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #include <time.h> #include <stdio.h> #include <stdlib.h> void main() { int num; srand(time(0)); num = rand() % 100; printf("rand : %d\n", num); num = rand() % 100; printf("rand : %d\n", num); num = rand() % 100; printf("rand : %d\n", num); } | cs |
출력결과가 매번 다릅니다.
3. 알파벳 랜덤으로 출력
아래 예제는 응용한 것으로 알파벳 소문자 a부터 z중 하나를 출력하는 예제입니다.
알파벳 개수가 26개기 때문에 rand() % 26 을하고 +'a' 를 합니다. 아스키2 코드를 이용 하는 것입니다.
그러면 a부터 z중 하나의 숫자가 출력됩니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #include <time.h> #include <stdio.h> #include <stdlib.h> void main() { int i; char ch; srand(time(0)); for (i = 0; i < 10; i++) { ch = rand() % 26 + 'a'; printf("rand : %c\n", ch); } } | cs |
- 출력결과 -
rand : e
rand : s
rand : b
rand : f
rand : i
rand : p
rand : n
rand : b
rand : j
rand : d
4. 로또 번호 추첨
1부터 45까지의 숫자를 중복없이 6개 출력하는 로또 번호추첨 예제이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | #include <time.h> #include <stdio.h> #include <stdlib.h> #define MAX 45 //1부터 45 숫자 #define NUMBER 6 //6개 숫자출력 void main() { int i, tmp; int save[NUMBER]; int count = 0; int isSame = 0; srand(time(0)); //숫자 추출 while (count < NUMBER) { isSame = 0; tmp = rand() % MAX + 1;//1부터 45 출력 for (int i = 0; i < count; i++) { //중복검사 if (tmp == save[i]) { //중복이 있을때 isSame = 1; break; } } if (isSame == 0) { //중복없음 save[count] = tmp; count++; } } //결과 출력 printf("추첨 숫자 : "); for(i =0; i < NUMBER; i++) printf("%d ", save[i]); printf("\n"); } | cs |
- 출력결과 -
추첨 숫자 : 35 15 29 19 27 38
5. 프로그래밍 언어에서 난수(랜덤)란?
추가로 사실 대부분에 프로그램에서 사용하는 랜덤 함수들은 정밀하게는 완벽한 랜덤이 아닙니다. 난수표 라고해서 특성 숫자들이 적힌 테이블이 있는데 이 테이블들을 순서대로 출력하는 것 입니다.
예를들어 1 5 4 2 0 3 7 6 란 숫자가 있으면 1을 선택하고 그 다음에는 5를 선택하고 이런식으로 차례대로 숫자를 선택합니다. 이와 같은 방식으로 C와 C++에서는 0부터 32767 까지의 숫자들이 난수표에 적혀 있습니다. 그래서 엄밀하게는 완벽한 랜덤이라고 할 수 는 없습니다.
따라서 보안이 중요한 곳이나 이런데서는 랜덤함수를 사용할때 주의가 필요합니다. 랜덤함수를 사용하여 추출한 결과를 보면 다음 수를 예측하거나 하는 방법으로 해킹등을 할 수도 있기 때문입니다.
'C, C++' 카테고리의 다른 글
C/C++ 동적 메모리할당 malloc, calloc, realloc 함수 비교 및 예제 (0) | 2018.06.18 |
---|---|
C/C++ malloc, free를 사용한 메모리 할당 및 해제(1차원, 2차원 배열) (0) | 2018.06.17 |
C언어/C++ 콘솔 화면 초기화 방법, 예시 (0) | 2018.06.04 |
C언어/C++ 딜레이 함수 Sleep(), 설명, 사용예시 (0) | 2018.06.04 |
C,C++ 콘솔화면에 원하는 좌표로 커서 이동하기 (0) | 2018.06.02 |