코딩 | 개념 정리/C

[C언어] 난수생성의 rand() 라이브러리 정복하기

PatienceLee 2021. 4. 19. 12:47

이번 포스팅에서는 난수를 생성할 때 사용하는 rand() 함수에 대해 다뤄보도록 하겠습니다.

기본적으로 rand() 라이브러리는 stdlib.h 에 포함되어 있으므로 시작할 때 

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

전처리기로 stdio.h와 stdlib.h를 같이 호출해주셔야 합니다.

난수를 생성하는 방법은 간단한데요.

아래와 같이 rand()라고만 작성해주시면 정수형 int의 출력범위에서 임의의 값을 하나 출력해줍니다.

#include<stdio.h>
#include<stdilb.h>

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

▲ 위 코드 실행시 화면 출력 값

여기서 난수 출력 범위를 수정하고 싶다면?

rand() % 5 : 0~4 중에 한가지 수를 출력

rand() % 5 + 1: 1~5 중에 한가지 수를 출력

rand() % ((150-100)+1) + 100: 100~150 중에 한가지 수를 출력

범위지정법은 rand() % ((마지막값-시작값)+1) + 시작값

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

int main(void)
{
	for(int i = 0; i < 5; i++)
	{
		printf("%d\n", rand() % 5); // 0~4중에 하나 출력
	}

	printf("===================\n");

	for (int i = 0; i < 5; i++)
	{
		printf("%d\n", rand() % 5 + 1); // 1~5중에 하나 출력
	}

	printf("===================\n");

	for (int i = 0; i < 5; i++)
	{
		printf("%d\n", rand() % ((150-100) + 1) + 100); // 100~150중에 하나 출력
	}
	return 0;
}

▲ 위 코드 실행시 화면 출력 값

그런데....

해당 코드를 계속 실행보시다보면 난수인데 왜 결과값이 항상 똑같지? 라는 의문이 드실겁니다.

이를 해결하려면 SEED 값을 바꿔줘야 합니다.

방법은 아래와 같습니다.

1. time() 라이브러리를 사용하기 위해 전처리기에 time.h 를 추가해줍니다.

2. srand(time(0))으로 선언을 해서 rand()의 seed 값을 바꿔줍니다.

3. 그럼 이제 매 실행시마다 같았던 난수값이 변경되는걸 확인하실 수 있습니다.

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

int main(void)
{
	srand(time(0)); // 난수의 시드 초기화

	for(int i = 0; i < 5; i++)
	{
		printf("%d\n", rand() % 5); // 0~4중에 하나 출력
	}

	printf("===================\n");

	for (int i = 0; i < 5; i++)
	{
		printf("%d\n", rand() % 5 + 1); // 1~5중에 하나 출력
	}

	printf("===================\n");

	for (int i = 0; i < 5; i++)
	{
		printf("%d\n", rand() % ((150-100) + 1) + 100); // 100~150중에 하나 출력
	}
	return 0;
}

 

▲ 위 코드 실행시 화면 출력 값

이상으로 rand() 라이브러리를 정복해보았습니다.

 

그럼 오늘도 거운 딩!

반응형