본문 바로가기
c언어

c언어 라이브러리 함수(내장 함수) 알아보기 1(난수 함수)

by 개발자 L 2022. 12. 6.
반응형

c언어 라이브러리 함수(내장 함수) 알아보기 1(난수 함수)

네 안녕하세요, 이번 포스팅에서는 c언어에서 사용하는 내장 함수 중에 난수를 다루는 함수들에 대하여 알아보도록 하겠습니다.

우리가 사용하는 프로그램들은 다들 무작위성이 강합니다.

그래서 난수를 필히 사용을 하게 되죠.

이만큼 중요한 요소이기 때문에 잘 알고 넘어가야 합니다.

그럼 지금부터 시작하도록 하겠습니다.

 

1. 난수 함수

난수 함수는 말 그대로 규칙성이 존재하지 않아서 임의로 생성되는 수들을 다루는 함수를 말합니다.

그리고 이러한 난수는 특히 프로그래밍을 할 때 테스트를 해본다거나, 암호학, 혹은 게임 관련한 일을 할 때 매우 중요하게 사용을 합니다.

그리고 이러한 난수는 크게 두 가지의 경우로 나뉩니다.

  • 초기값에 따라 순서가 어느 정도는 정해져 있는 난수
  • 뭐가 나올지 모르는 난수

이 두 가지로 나뉩니다.

 

1 - 1. 초기값에 따라 순서가 어느 정도 정해져 있는 난수(rand() 함수 이용)

초기값에 따라 어느 정도 난수의 배열이 정해져 있다고 한다면 rand() 함수를 씁니다.

그래서 rand() 함수가 다루는 난수의 이름을 '의사 난수'라고 합니다.

이 함수는 stdlib.h 헤더 파일에 정의가 되어 있고, 이 함수를 쓰려면 stdlib.h 헤더 파일을 꼭 넣어야 합니다.

그리고 rand()의 범위는 0부터 RAND_MAX까지의 범위 내에서 숫자를 생성을 합니다.

그래서 rand() 함수의 사용법은 다음과 같습니다.

// 기본적인 사용 방법
rand() % n

// 1부터 자기 자신까지 세어야 하는 경우
1 + rand() % n

이렇게 씁니다.

그 이유는 rand() 함수가 제일 먼저 세는 수가 0이기 때문에,

항상 본인이 선언한 범위의 숫자보다 1 작게 셉니다.

그래서 세어지는 수는 같지만, 자기 자신이 빠지는 겁니다.

하지만 자기 자신을 꼭 세어야 하는 경우도 존재를 하죠.

그럴 경우는 보통 시작 숫자가 0이 아니라 1입니다.

그래서 rand() 함수 앞에 1을 더해주는 것입니다.

그러면 그 예시를 한 번 들어보도록 하겠습니다.

제일 대표적인 경우가 바로 로또 번호를 추첨하는 것입니다.

로또 번호는 무작위성이 강한 것 중 하나입니다.

그럼 바로 이를 예로 들어서 한 번 코드를 작성해보도록 하겠습니다.

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

int main()
{
    for(int i = 0; i < 6; i++)
    {
        printf("%d ", 1 + rand() % 45);
    }
    
    printf("\n");
    
    return 0;
}

이렇게 작성을 해볼 수 있습니다.

그럼 결과도 한 번 같이 보시죠.

42 18 35 41 45 20

이렇게 결과도 잘 나온 것을 볼 수가 있습니다.

반응형

 

1 - 2. 뭐가 나올지 모르는 난수

그리고 이렇게 순서가 어느 정도는 정해져 있는 경우가 아니라 아예 처음부터 실행이 될 때마다 완전히 다른 숫자가 나오는 경우도 있습니다.

그럴 경우에는 시드(seed)라는 것을 사용을 하게 됩니다.

시드는 프로그램이 실행이 될 때 쓰이는 씨앗값인데,

이는 난수 프로그램이 생성이 될 때 마다 달라지는 값입니다.

그래서 이를 반영하는 가장 좋은 요소가 바로 시간입니다.

그래서 시간을 다루는 함수인 time()을 씁니다.

그리고 이 함수는 srand() 함수와 세트이며, time.h라는 헤더 파일을 이용하여 불러옵니다.

그리고 이는 시간이 달라질 때 마다 시드 값을 다르게 줄 수 있는 매우 유용한 함수입니다.

사용법은 이러합니다.

srand((unsigned)time(NULL));

여기서 usigned 값을 주는 이유는 signed 값은 음수까지 포함을 하기 때문입니다.

하지만 기본적으로 시간은 역행을 하지 않죠?

그래서 0을 포함한 양수만 셀 수 있도록 unsigned값을 입력을 해주는 것입니다.

그리고 time() 함수 안에 NULL값을 주는 이유는, NULL은 빈 값이라는 의미를 가지는데,

이는 공백과는 전혀 다른 성질을 지닙니다.

NULL은 비어있다는 것을 알리는 값이기 때문에 엄연히 값입니다.

그렇지만 그냥 공백은 값 자체가 존재하지 않는다는 뜻입니다.

그럴 경우에는 time() 함수 안에 이상한 값이 들어올 수도 있기 때문에 NULL값으로 그걸 미연에 방지를 해주는 것입니다.

그럼 이걸 이용하여 난수를 생성하는 프로그램을 한 번 작성을 해보도록 하겠습니다.

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

#define MAX_NUMBER 45

int main()
{
    srand((unsigned)time(NULL));
    
    for(int i = 0; i < 6; i++)
    {
        printf("%d ", 1 + rand() % MAX_NUMBER);
    }
    
    printf("\n");
    
    return 0;
}

제가 이전에 작성했던 로또 번호 뽑는 프로그램을 좀 더 보완을 한 소스입니다.

이렇게 하면 완전한 무작위 실행 프로그램이 됩니다.

그럼 실행을 한 번 해보도록 하겠습니다.

// 1회차 실행
9 16 38 45 38 18

// 2회차 실행
22 27 11 20 23 20

// 3회차 실행
29 5 1 25 34 35

이렇게 무작위성이 매우 짙은 결과가 나옴을 볼 수가 있습니다.

 

여기까지 난수 함수에 대하여 알아보는 시간을 가져보았는데요,

다음 포스팅에서는 수학 관련 함수에 대하여 알아보도록 하겠습니다.

긴 글 읽어주신 독자분들께 진심으로 감사합니다 ~

반응형

댓글