C언어/참고서: C언어 콘서트

C언어 랜덤함수, 난수 만들기, rand(), rand()%, srand(), time(NULL)

Olivia-BlackCherry 2023. 3. 25. 20:28

목차

    1. 랜덤이란?

    무작위를 뜻한다. 정해진 규칙이 없다. 그냥 운에 따라 아무거나 선택되는 것이다. 

     

     

    2. 표준 라이브러리 이용

    #include <stdlib.h>

    C언어 프로그래밍에서 랜덤 코드를 작성하기 위해서는

    stdlib.h 라이브러리를 이용해야 한다.

    라이브러리란 자주 사용하는 함수들을 미리 작성하여 저장해둔 파일로,

    맨 머리맡에 #include 코드를 추가해 헤더파일로 적어준다.

     

     

    3. stadlib.h 라이브러리

    stdlib.h에 속해있는 함수 중 rand(), srand() 함수를 이용하자.

    srand : 전달받는 인자 기반으로, 난수 초기화
    rand : 0~32767 중 하나의 난수 생성(무작위)

     

    3-1. rand()

    rand() 함수는 0~32767 사이의 하나의 수를 무작위로 생성한다.

    rand() 함수를 사용할 때는 %(나머지) 연산자를 사용한다.

    rand() % n : 0~n-1 범위의 난수 생성
    (rand() % n) +1 : 1~n 범위의 난수 생성

     

    원리는 '나머지'이다.

    x = rand() % 3

    라면, x에 해당하는 값은 0~ 2 사이의 한 수이다. 

    x= rand()% 8

    라면, x에 해당하는 값은 0~7 사이의 한 수이다.

     

    만약 

    x = rand() % 3 + 1

    라면, x에 해당하는 값은 1~ 3 사이의 한 수이다. 

    x= rand()% 8 + 1

    라면, x에 해당하는 값은 1~8 사이의 한 수이다.

     

    그런데 여기서 문제가 있는데, 프로그램이 실행 시 항상 같은 난수가 생성된다. 

    진정한 의미의 난수가 생성되려면

    프로그램 실행 시 매번 다른 난수가 생성되야 한다. 

     

    이때 사용하는 것이 srand() 함수이다.

     

     

    3-2. seed()

    시드는 난수 생성할 때 씨앗값이 된다.

    시드값이 달라져야 이후 생성되는 모든 난수값이 달라진다.

    시드값은 예측이 불가능하면서, 상황에 따라 변경되는 값이 좋다.

    보통 '현재 시각'을 시드값으로 사용한다.

    왜냐하면 프로그램이 실행되는 시간은 다를 가능성이 많기 때문이다.

     

     

    3-3 time()

    time()를 호출하여 1970.1.1부터 현재까지 경과된 시간을 초단위로 반환한다.

     

    3-4 srand()

    인수로 time(NULL)을 받아, rand()함수에 무작위 시드값을 준다. 

    이걸 써야 난수 발생기의 seed가 현재 시간으로 초기화 되어

    매번 다른 난수가 생성된다.

     

    따라서 rand함수를 쓰기 전,  아래의 코드를 먼저 적어준다.

    #include <time.h>
    srand(time(NULL));

     

     

    4. <time.h> 라이브러리

    srand() 함수가 진정한 난수를 생성하는 원리를 구체적으로 이야기해보자.

    우선, srand()의 파라미터로 time(NULL) 매개변수가 전달된다.

     

    4-1. time(NULL)

    time(NULL)은 1970년 1월 1일 이후 경과된 시간을 초 단위로 반환하는 함수다.

    이를 srand() 함수의 매개변수로 불러와야 

    1초 단위로 매번 다른 시드값을 생성해 rand 함수를 호출하는 것이다.

    그러면 무작위 수를 생성할 수 있다.