본문 바로가기
C 언어 프로그래밍/함수

[C언어] 랜덤 함수, 난수 생성 함수, rand()

by 프밍샘 2020. 6. 25.

랜덤(random) 함수, 난수 생성 함수

난수(random number)는 특정한 규칙을 가지지 않은 수를 말합니다. C언어에서 제공하는 난수를 생성하는 함수에는 rand()함수가 있습니다. rand()함수를 사용하기 위해서는 stdlib.h 헤더 파일을 포함시켜야 합니다. rand()함수는 0~ 32,767의 수 중 무작위로 하나의 수를 반환합니다. 아래는 rand()함수를 이용하여 난수 1개를 출력하는 프로그램입니다.

 

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

int main()
{	
	printf("%d", rand());
	
	return 0;
}

 

 

변수를 이용하여 rand()함수를 사용할 수도 있습니다.

#include <stdio.h>
#include <stdlib.h>
int main()
{
	int random;
	
	random=rand();
	
	printf("%d", random);
	
	return 0;
}

출력 결과

 

 

10개의 난수를 출력하는 프로그램입니다.

#include <stdio.h>
#include <stdlib.h>
int main()
{
	int i, random;
	
	for(i=0;i<10;i++)
	{
		random=rand();
		printf("%d\n", random);
	}
	
	return 0;
}

출력 결과

 

 

프로그램을 여러번 실행시키면 계속해서 같은 결과가 나오게 되는데 이는 C언어가 하나의 숫자 테이블을 참조하여 랜덤 숫자를 생성한다는 것을 알 수 있습니다. 실제로 컴퓨터는 정해진 입력에 따라 출력을 하기 때문에 사람처럼 우연한 어떤 값을 생성할 수는 없습니다. 컴퓨터가 랜덤한 값을 출력하려면 여러 계산 과정을 거친 후 값을 출력하여 사용자에게 랜덤한 값인 것처럼 보이게 해야합니다. 

 

 

 

출력할 때마다 다른 수가 나오게 하려면?

 

먼저 참조하는 숫자 테이블을 여러 개 만든 뒤 난수를 발생시킬 때마다 다른 숫자 테이블을 참조한다면 랜덤한 값인 것처럼 보일 수 있습니다. 다른 숫자 테이블을 선택하는 것을 시드(seed)라고 하고 srand(seed)함수는 시드를 선택할 수 있습니다. 아래의 프로그램은 시드(seed)가 1일 때 입니다.

 

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

int main()
{	
	srand(1);
	
	printf("%d", rand());
	
	return 0;
}

출력 결과

 

시드(seed)가 2일 때 입니다. 

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

int main()
{	
	srand(2);
	
	printf("%d", rand());
	
	return 0;
}

출력 결과

 

시드(seed)가 3일 때 입니다.

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

int main()
{	
	srand(3);
	
	printf("%d", rand());
	
	return 0;
}

출력 결과

 

시드(seed)를 100으로 해보겠습니다.

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

int main()
{	
	srand(100);
	
	printf("%d", rand());
	
	return 0;
}

출력 결과

 

 

시드가 달라지면 랜덤 함수의 출력값도 달라지는 것을 확인할 수 있었습니다. 그러나 시드에 따라 다른 숫자 테이블을 참조하여 출력값이 달리 나온다는 것은 알 수 있지만 여러번 출력해보면 값이 달라지지는 않는 것을 볼 수 있습니다. 여기서 생각해볼 수 있는 것은 프로그램을 작성할 때 시드를 계속 변화 시킬 수 있다면, 출력값을 매번 다르게 할 수 있다는 것입니다. 시드를 랜덤한 변수로 설정하는 방법은 여러가지가 있습니다만 가장 많이 사용하는 방법은 현재의 시간을 시드로 사용하는 것입니다. 아래의 예제는 현재의 시간을 이용하여 시드를 설정하였습니다. 현재의 시간에 관한 함수인 time()을 사용하였고, time()함수를 사용하기 위해 time.h 라이브러리를 포함시켰습니다.

 

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

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

 

 

랜덤 숫자 테이블을 기반으로 하는 랜덤 함수를 어느 정도 진행하게 되면 같은 패턴이 반복되게 되는데 이것은 진정한 랜덤함수라고 볼 수 없습니다. 이처럼 숫자 테이블을 기반으로 하는 난수를 의사난수(Pseudo Random)라고 합니다. 의사난수는 보안에 약합니다. 위의 예제처럼 현재의 시간을 시드로 사용한다고 하더라도 시간의 규칙성 때문에 어느 정도 진행되면 패턴이 나타날 수 있습니다. 진짜 난수를 만들기 위해서는 cpu메모리의 클럭속도 또는 온도, 컴퓨터의 노이즈, 사용자의 마우스 움직임 등 물리적인 시스템이나 사람의 움직임을 이용하는 방법, 양자역학적 시스템을 이용하는 방법 등이 있습니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'C 언어 프로그래밍 > 함수' 카테고리의 다른 글

라이브러리 함수  (0) 2020.06.16
사용자 정의 함수  (0) 2020.06.16

댓글