C언어 난수 10개 - Ceon-eo nansu 10gae

C언어 난수 10개 - Ceon-eo nansu 10gae
실행결과
#include<stdio.h>
#include <stdlib.h>
#include <time.h> 

void main()
{
	srand(time(NULL));
	int a[10], i, x, y, z, sum = 0;

	for (i = 0; i < 10; i++)
	{
		a[i] = rand() % 10;
		printf("%d\n", a[i]);
	}
	
	printf("인덱스 범위 입력 : ");
	scanf("%d %d", &x, &y);

	for (z = x; z <= y; z++)
	{
		sum += a[z];
	}
	printf("인덱스 범위의 합 = %d\n ", sum);
}

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

void main()
{
	srand(time(NULL));
	int a[10], i, sum1 = 0, sum2 = 0;

	for (i = 0; i < 10; i++)
	{
		a[i] = rand() % 10;
		printf("%d\n", a[i]);

		
		if (a[i] % 2 == 0)
		{
			sum1 += a[i];
		}
		else
		{
			sum2 += a[i];
		}
		
	}
	printf("짝수 합 : %d", sum1);
	printf("홀수 합 : %d", sum2);

}
C언어 난수 10개 - Ceon-eo nansu 10gae
실행결과

srand()와 rand()를 통해서 0 ~ 32767을 랜덤하게 추출할 수 있었습니다.

1~10까지의 숫자를 랜덤하게 추출하는 방법은 나머지 연산을 이용하는 것입니다.

rand() % MOD

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

const int SIZE = 10;
int idx, list[SIZE];

int main() {
       srand(time(NULL));
       while (idx < SIZE) {
              int val = rand() % SIZE;
              list[idx++] = val;
       }
       for (int i = 0; i < SIZE; ++i) {
              printf("%d\n", list[i] + 1);
       }
}
C언어 난수 10개 - Ceon-eo nansu 10gae

"% 10"을 통해서 0 ~ 9까지의 숫자를 랜덤하게 받을 수 있으므로

해당 수치 + 1을 하면 [1...10]까지의  숫자를 얻을 수 있습니다.

중복 여부를 확인하지 않기 때문에 중복된 숫자가 랜덤하게 나타날 수 있습니다.

(값을 굳이 list[]에 저장하지 않고 출력해도 무방합니다.)

1~10까지의 숫자가 이미 나왔는지 확인해야하므로 check[11] 변수를 이용합니다.

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

const int SIZE = 10;
int idx, list[SIZE];

int main() {
       srand(time(NULL));
       while (idx < SIZE) {
              int val = rand() % SIZE;
              list[idx++] = val;
       }
       for (int i = 0; i < SIZE; ++i) {
              printf("%d\n", list[i] + 1);
       }
}
C언어 난수 10개 - Ceon-eo nansu 10gae

1~10까지의 숫자가 중복없이 랜덤하게 출력되는 것을 확인

C언어 난수 10개 - Ceon-eo nansu 10gae

C언어 난수 10개 - Ceon-eo nansu 10gae

난수, 랜덤

다양한 프로그래밍에는 난수 즉 랜덤으로 숫자를 생성하여 사용하는 경우가 많이 있습니다. 

C언어에서는 이런 난수를 생성하기 위한 라이브러리를 제공합니다.

라이브러리 추가하기

난수를 생성하기 위한 함수들은 stdlib.h를 추가하여야만 정상적으로 사용할 수 있습니다.

#include<stdio.h> // 표준 입출력 라이브러리 헤더
#include<stdlib.h> // 난수 생성 기능이 있는 라이브러리 헤더

rand() 함수 - 난수를 생성해주는 함수

rand() 함수를 호출함으로써 난수를 생성할 수 있습니다. 이 함수의 원형은 아래와 같습니다.

int rand();
  • 인자는 존재하지 않고 int형으로 반환하는 함수의 형태입니다.
  • 0부터 INT_MAX의 크기까지의 숫자를 반환합니다.

이 함수와 %연산을 이용해서 100 이하의 숫자 3개를 랜덤으로 뽑아내 보도록 하겠습니다.

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

int main() {

	for (int i = 0; i < 3; i++) {
		printf("%d\n", (rand() % 100));
	}
	return 0;
}
C언어 난수 10개 - Ceon-eo nansu 10gae

위의 화면처럼 rand함수를 통해 랜덤숫자를 뽑아내어 출력할 수 있습니다. 하지만 위 프로그램은 한 가지 큰 문제점이 있습니다. 바로 다시 프로그램을 실행해도 동일한 숫자 결과가 나오게 됩니다. 항상 랜덤 한 값을 받고 싶은 경우 문제가 생깁니다. 

srand() 함수 - rand함수는 특정 값들이 저장된 곳에서 값을 찾아오는 것이다.

위와 같은 결함이 생기는 이유는 바로 rand 함수를 호출하면 랜덤한 값을 생성하는 것이 아닌 특정한 값들이 저장돼 있는 곳에서 값을 순서대로 추출하기 때문입니다. 그렇기 때문에 특정한 값들이 저장되어 있는 공간이 바뀌지 않는 다면 계속해서 동일한 값을 출력하게 됩니다.

그 특정한 값이 저장되어 있는 공간의 값들을 변경시키기 위한 함수가 바로 srand() 함수입니다. 정리하자면 아래와 같습니다.

  • rand() 함수는 특정한 공간의 값을 차례대로 읽어오는 역할을 한다.
  • 특정한 공간의 값들은 srand()함수로 변경할 수 있다. 

그렇다면 srand()를 이용해서 특정한 공간에 저장되어 있는 값들의 설정을 변경하고 실행해 보도록 하겠습니다.

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

int main() {

	srand(2);
	for (int i = 0; i < 3; i++) {
		printf("%d\n", (rand() % 100));
	}
	return 0;
}
C언어 난수 10개 - Ceon-eo nansu 10gae

srand를 사용하지 않았을때와는 다른 랜덤 한 숫자가 나오는 것을 확인할 수 있습니다. 하지만 위처럼 프로그래밍을 한다 하더라고 srand(2)를 통해 계속해서 특정한 임의의 값들이 설정되어 있기 때문에 프로그램을 다시 실행하면 동일한 결과가 나오게 됩니다. 프로그램을 실행할 때마다 srand()의 인자 값을 변경해야만 원하는 결과를 만들어 낼 수 있습니다.

time함수를 통한 srand의 설정

결국 위의 결과로 유추해 본다면 srand의 인자값이 변화된다면 매번 생성되는 난수의 값도 변화된다는 것을 알 수 있습니다. 여러 보안이나 이런 이유로 다양한 방법으로 난수를 생성하기 위한 srand의 인자 값을 만들 수 있지만 가장 쉽고 대표적인 예제는 바로 시간을 통해서 srand를 설정하는 방법입니다.

C언에서 시간에 내용은 다음 포스트에서 다루기로 하고 본 포스트에서는 time함수를 통해서 srand를 그리며 매번 프로그램이 실행될 때마다 다른 난수를 생성할 수 있는 소스코드로 마무리하겠습니다.

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

int main() {

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

위와 같이 srand에 인자로 time(NULL)을 통해 시간에 따라 srand의 값이 변화되며 추출하는 데이터가 변화되게 할 수 있습니다.