본문 바로가기
프로그래밍/C

[ C언어 ] 중복없이 난수생성 / 랜덤값 뽑기 / 로또번호 생성 / 선택정렬 (rand, srand, time 함수)

by eteo 2022. 4. 4.

1. stdlib.h, time.h 헤더파일 포함하기

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

 

2. 메인함수 안쪽 상단에 srand((unsigned)time(NULL)); 를 한번만 사용

srand((unsigned)time(NULL));

진정한 의미의 난수생성을 위해 time을 seed값으로 넣어주는 부분, 간혹 컴파일 에러가 뜨는 경우가 있어 unsigned로 캐스팅해준다고 한다.

 

3. rand() 함수와 % 나머지연산자를 활용하여 랜덤값 생성

예를들어,

0~9 사이의 난수생성을 원한다면 rand()%10

1~10 사이의 난수생성을 원한다면 (rand()%10)+1

 

4. 중복없이 난수 뽑기

만약 뽑아야할 난수의 갯수가 많지 않다면 이런 방법도 있다.

	for (;;) {
		a = rand() % 10;
		b = rand() % 10;
		c = rand() % 10;

		if (a != b && b != c && a != c) break;
	}

 

 

하지만 갯수가 많아진다면 배열을 사용하는 편이 편리하다

만약 중복없이 1~10사이의 숫자 5개를 뽑는다면, 이런식으로 할 수 있다.

	for (i = 0; i < 5; i++) {
		a[i] = (rand() % 10) + 1;
		for (j = 0; j < i; j++) {
			if (a[i] == a[j]) i--;
		}
	}

순서대로 난수를 배열에 저장하고

안쪽 for문에서 i번의 검사를 하며, 만약 중복이 있다면 i--하여

다시 난수를 할당하고 검사하는 식이다.

 

그럼 로또번호를 생성해보자

 

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define SIZE 6

int main() {

	int rotto[SIZE];
	int i,j;

	srand((unsigned)time(NULL));

	for (i = 0; i < SIZE; i++) {	// 로또번호 뽑기
		rotto[i] = (rand() % 45) + 1;
		for (j = 0; j < i; j++) {
			if (rotto[i] == rotto[j]) i--;
		}
	}

	printf("로또번호 생성기: \n");	// 출력
	for (i = 0; i < SIZE; i++) {
		printf("%d ",rotto[i]);
	}
	
	return 0;
}

결과창

근데 번호가 무작위로 있으니 별로 안예쁘다.

 

5. 선택정렬

선택정렬으로 오름차순 정렬까지 해주자.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define SIZE 6

void SelectionSort(int arr[]);

int main() {

	int rotto[SIZE];
	int i,j;

	srand((unsigned)time(NULL));

	for (i = 0; i < SIZE; i++) {	// 로또번호 뽑기
		rotto[i] = (rand() % 45) + 1;
		for (j = 0; j < i; j++) {
			if (rotto[i] == rotto[j]) i--;
		}
	}
	
	SelectionSort(rotto);	// 선택정렬

	printf("로또번호 생성기: \n");	// 출력
	for (i = 0; i < SIZE; i++) {
		printf("%d ",rotto[i]);
	}
	
	return 0;
}
void SelectionSort(int arr[]) {
	int i, j, min, temp;

// 마지막 하나는 자동으로 제일 큰값이 배치되니까 SIZE-1 까지만 반복
	for (i = 0; i < SIZE-1; i++) {
		min = i;
		for (j = i + 1; j < SIZE;j++) {
			if (arr[j] < arr[min]) min = j;		// i+1부터 SIZE까지 돌며 최소값 찾기
		}
        // 교환
		temp = arr[i];
		arr[i] = arr[min];
		arr[min] = temp;
	}
}

 

 

결과창

선택정렬의 알고리즘 사진을 첨부함

출처 :&nbsp;https://www.w3resource.com/php-exercises/searching-and-sorting-algorithm/searching-and-sorting-algorithm-exercise-4.php