Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C 언어에서 randomize()와 srand() 함수의 역할과 사용법

프로그램에서 난수(random number)를 생성할 때는 숫자 시퀀스를 제어하는 것이 매우 중요합니다. 아무런 설정 없이 rand() 함수만 사용하면 프로그램을 실행할 때마다 항상 동일한 숫자들이 출력되기 때문입니다.

이 문제를 해결하기 위해 사용되는 것이 바로 randomize()srand() 함수입니다. 이 두 함수는 난수 생성기(random number generator)에 시드(seed) 값을 부여하는 역할을 합니다.

시드(Seed)란 무엇인가?

난수 생성기에 시작 숫자를 지정하는 과정을 시딩(seeding)이라고 부릅니다. 컴퓨터의 난수 생성기는 실제로 완전히 무작위적인 값이 아니라, 시작점인 시드를 기반으로 정해진 알고리즘에 따라 수열을 만들어내는 의사 난수(pseudo-random number) 방식이기 때문에 시드 값이 같으면 항상 같은 결과가 나옵니다.

두 함수의 차이는 다음과 같습니다.

  • randomize() — PC의 시스템 클럭(현재 시각)을 이용해 자동으로 무작위 시드를 생성합니다.

  • srand() — 개발자가 직접 난수 생성기의 시작 값을 지정할 수 있도록 해줍니다. 일반적으로 srand(time(0))처럼 현재 시간을 시드로 넘겨 실행할 때마다 다른 시퀀스가 나오도록 설정합니다.

예제 1: rand()만 사용한 경우 (시드 없음)

아래 프로그램은 시드를 지정하지 않고 rand() 함수만 호출합니다. 따라서 프로그램을 실행할 때마다 항상 동일한 난수 시퀀스가 출력됩니다.

#include<stdio.h>
int main(){
    // 프로그램을 실행할 때마다
    // 동일한 난수 시퀀스가 생성됨
    for(int i = 0; i<10; i++)
        printf(" %d ", rand());
    return 0;
}

출력 결과

1804289383
846930886
1681692777
1714636915
1957747793
424238335
719885386
1649760492
596516649
1189641421

프로그램을 여러 번 실행해 보면 위와 똑같은 숫자들이 매번 반복되는 것을 확인할 수 있습니다.

예제 2: srand()로 시드 지정

아래 프로그램은 srand(time(0))을 호출하여 현재 시간을 시드로 사용합니다. 시간은 계속 변하므로 프로그램을 실행할 때마다 서로 다른 난수 시퀀스가 생성됩니다.

#include <stdio.h>
#include <stdlib.h>
#include<time.h>
int main(){
    // 프로그램을 실행할 때마다
    // 다른 난수 시퀀스가 생성됨
    // 현재 시간을 난수 생성기의 시드로 사용
    srand(time(0));
    for(int i = 0; i<10; i++)
        printf(" %d ", rand());
    return 0;
}

출력 결과

1919778910
1203408690
1755813469
1976428341
37040990
1849384103
986990763
2040061815
391541163
1718314135

정리

srand() 함수를 사용하려면 <stdlib.h> 헤더가 필요하고, time() 함수를 함께 사용하려면 <time.h> 헤더를 포함해야 한다는 점도 기억해 두세요. 테스트나 디버깅 시에는 재현성을 위해 고정된 시드를 사용하고, 실제 게임이나 시뮬레이션 등에는 time(0)을 시드로 활용하는 것이 일반적인 개발 패턴입니다.