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;
}
}
결과창
선택정렬의 알고리즘 사진을 첨부함
'프로그래밍 > C' 카테고리의 다른 글
[ C언어 ] 프로젝트(삽질일기) : 도서 관리 프로그램 - (2) - 동적 메모리 할당 (0) | 2022.04.22 |
---|---|
[ C언어 ] 프로젝트(삽질일기) : 도서 관리 프로그램 - (3) - 동적 메모리 할당 - 구조체 배열 크기 동적 조절 ( 확대 / 축소 ), #ifdef DEBUG 사용 (0) | 2022.04.22 |
구조체의 크기 / 구조체 정렬 - 패딩비트를 #progma pack 사용으로 해결 (0) | 2022.04.20 |
64비트 운영체제인데 포인터 크기가 왜 4바이트라고 나올까? (0) | 2022.04.14 |
[ C언어 ] 프로젝트(삽질일기) : 도서 관리 프로그램 - (1) - 구조체 배열 (0) | 2022.04.12 |