C 에서 난수와 랜덤 문자열 생성하기

이번시간에 C에서 난수 생성과 Random string (무작위 문자열)을 생성하는 방법에 대하여 배워보도록 하겠습니다.
C에서 무작위 문자열을 만들기 위해서 중요 함수는 다음과 같습니다.

중요 함수 소개

void srand(unsigned int seed);

함수에서 사용하는 rand 의사 번호 생성기의 시작 시드 값을 설정합니다.
이 함수는 전체 프로그램에서 한번만 실행 되면 됩니다.
매개변수인 seed 은 현재 시간을 사용 하면 됩니다.
srand(time(0));

int rand(void);

rand 함수는 0부터 RAND_MAX(32767) 범위의 의사 난수 정수를 반환합니다.

간단한 난수 생성 예제를 보여 드리겠습니다.

#include <stdlib.h> // rand(), srand()
#include <stdio.h> // printf()
#include <time.h> // time()

void SimpleRandDemo(int n)
{
    // Print 난수 10 번
    for (int i = 0; i < n; i++)
    {
        printf("  %6d\n", rand());
    }
}

void RangedRandDemo(int range_min, int range_max, int n)
{
    for (int i = 0; i < n; i++)
    {
        int r = ((double)rand() / RAND_MAX) * (range_max - range_min) + range_min;
        printf("  %6d\n", r);
    }
}

int main(void)
{
    srand(time(0));

    printf("간단한 Rand demo ====\n\n");
    SimpleRandDemo(10);
    printf("\n범위 지정 난수 ====\n\n");
    RangedRandDemo(-100, 100, 10);
}
C 에서 난수와 랜덤 문자열 생성하기
그림1. rand

random 문자열 생성

간단 랜덤 문자열 함수

c에서는 random 문자열을 생성하는 방법중 그래도 제일 검증된 방법은 다음방법이 있습니다.
한글자 한글자 rand 로 정수를 생성해서 이를 문자로 바꾸는 방법입니다.

static char* rand_string(char* str, size_t size)
{
    const char charset[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789,.-#'?!";
    if (size)
    {
        --size;
        for (size_t n = 0; n < size; n++)
        {
            int key = rand() % (int)(sizeof charset - 1);
            str[n] = charset[key];
        }
        str[size] = '\0';
    }
    return str;
}

for 문으로 길이만큼 한글자 한글자 난수를 생성해서 charset 배열에서 해당 문자를 뽑아내어 문자열로 만드는 방법입니다.
어떤가요? 어렵지 않죠.

charset 부분만 잘 수정하면 특정 숫자로만 된 Rnadom 문자열을 만들수도 있습니다.

const char charset[] = "0123456789"; 

위 코드 에서 이렇게 수정하면 됩니다.

전체 코드

#include <stdlib.h> // rand(), srand()
#include <stdio.h> // printf()
#include <time.h> // time()


static char* rand_string(char* str, size_t size)
{
    const char charset[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789,.-#'?!";
    if (size)
    {
        --size;
        for (size_t n = 0; n < size; n++)
        {
            int key = rand() % (int)(sizeof charset - 1);
            str[n] = charset[key];
        }
        str[size] = '\0';
    }
    return str;
}

static char* rand_string_number(char* str, size_t size)
{
    const char charset[] = "0123456789";
    if (size)
    {
        --size;
        for (size_t n = 0; n < size; n++)
        {
            int key = rand() % (int)(sizeof charset - 1);
            str[n] = charset[key];
        }
        str[size] = '\0';
    }
    return str;
}

int main()
{
    char randbuff[65] = {0,};
    srand(time(0));

    rand_string(randbuff, 64);
    printf("랜덤 문자열:\n");
    printf("%s\n\n", randbuff);

    printf("랜덤 숫자구성 문자열:\n");
    rand_string_number(randbuff, 20);
    printf("%s\n", randbuff);
}

C 에서 난수와 랜덤 문자열 생성하기
그림2. 랜덤 문자열 출력

결론

코드와 예제를 통해 C 에서 랜덤 숫자와 문자열을 생성하는 방법을 배웠습니다.

C# 에서는 의 같은 기능이 궁금하시면 이전글 참고 하시면 됩니다.

Leave a Comment