rand()와 srand()
1. 기본 개념
rand()
임의의 난수 하나를 생성한다.
범위는 0~RAND_MAX, 0~32767(0x7fff) 이다.
srand()
시간 값을 매개로 난수를 생성한다.
time(NULL)
현재 시간을 초단위로 변경해 반환
2. 기본 사용법
int num = rand() % n;
임의의 0 ~ n-1 범위 중 임의의 수 하나를 생성한다.
ex 1.) rand() % 5 의 범위는 0 ~ 4
ex 2.) rand() % 9 의 범위는 0 ~ 8
3. 응용 사용법
int i = rand() % n + m; // ex 1.) rand() % 4 + 1 의 범위는 1, 2, 3, 4 (연속된 수) int j = rand() % n * m; // ex 2.) rand() % 4 * 2 의 범위는 0, 2, 4, 6 (짝수, 2의 배수) int k = (rand() % n + m) * x; // ex 3.) (rand() % 4 + 2) * 3 의 범위는 0, 6, 12, 18 (6의 배수) int l = rand() % n * m + x; //ex 4.) rand() % 4 * 2 + 1 의 범위는 1, 3, 5, 7 (홀수)
4. 배열과 rand() 응용 사용법 (1)
int arr[4] = {1, 22, 389, 456789}; // int arr[MAX] = {MAX개 원소} int j = arr[rand() % 4] // 배열의 랜덤 위치값을 랜덤으로 초기화하기
5. rand()와 srand() 비교
#include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { // 01 int a = rand(), b = rand(); printf("%d\n", a); printf("%d\n", b); // 02 srand(time(NULL)); for(int i = 0; i < 6; i++) printf("%d | ", rand() % 44 + 1); return 0; } /* 실행결과 - rand() 를 사용한 값을 여러번 출력해보면, 랜덤값은 변하지 않고 같은 값을 가진다. - srand(time(NULL))를 통해 시드값(시간)을 변경한 후에는 실행마다 값이 변한다. - 하지만, 값이 중복된다. */

6. 중복 제거
#include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { int flag[46]; srand(time(NULL)); for (int i = 0; i < 6;) { int r = rand() % 44 + 1; if (flag[r]) continue; printf("%d\n", r); flag[r] = 1; i++; } return 0; }
7. array와 rand() 응용 사용법 (2)
확률 임의 조정
rand()%10 으로 나올 수 있는 수의 범위는 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
0~9 범위에서 하나의 수가 나올 수 있는 수학적 확률은 같다.
#include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { int arr[15] = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5}; int cnt[5] = { 0, }; double set[5], res[5], k, size = 9999999; srand(time(NULL)); printf("\n"); for (int l = 0; l < size; l++) { k = arr[rand() % 15]; if (k == 1) cnt[0]++; else if (k == 2) cnt[1]++; else if (k == 3) cnt[2]++; else if (k == 4) cnt[3]++; else if (k == 5) cnt[4]++; } for (int i = 0; i < 5; i++) { set[i] = (i + 1.0) / 15 * 100; res[i] = cnt[i] / size * 100.0; } printf("확률 임의 조정 : 총 %f 번 반복\n", size); printf("횟수 : %7d, %7d, %7d, %7d, %7d\n", cnt[0], cnt[1], cnt[2], cnt[3], cnt[4]); printf("설정 : %6.2f%%, %6.2f%%, %6.2f%%, %6.2f%%, %6.2f%%\n", set[0], set[1], set[2], set[3], set[4]); printf("실제 : %6.2f%%, %6.2f%%, %6.2f%%, %6.2f%%, %6.2f%%\n", res[0], res[1], res[2], res[3], res[4]); return 0; }

A. 숫자 중복 정렬
#include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { unsigned char number[11] = { 0, }; int cnt[11] = { 0, }; int input = 1; int max = sizeof(number) / sizeof(char); srand(time(NULL)); // 범위 입력 printf("\n"); printf("<< 320(Fri.) 과제>>\n\n정렬된 숫자 배열 중 중복된 숫자의 갯수는?\n\n"); printf("숫자의 범위를 입력해주세요 >> "); scanf(" %d", &input); getchar(); printf("\n"); // 정렬전 숫자 출력 printf("| 정렬전 | "); for (int i = 1; i < max; i++) { number[i] = rand() % input + 2; printf("%4d | ", (int)number[i]); } printf("\n\n"); // 정렬 for (int i = 1; i < max; i++) { int temp = 1; for (int j = i + 2; j < max; j++) { temp = number[i]; if (number[i] > number[j]) { number[i] = number[j]; number[j] = temp; } } } // 정렬후 숫자 출력 printf("| 정렬후 | "); for (int i = 1; i < max; i++) { printf("%4d | ", (int)number[i]); } printf("\n\n"); // 중복 확인 for (int i = 1; i < max; i++) { for (int j = 1; j < max; j++) { if (number[i] == number[j]) cnt[i]++; } } // 전체 출력 printf("<< 전체 중복 출력 >>\n\n"); printf("| 숫자 | 중복 |\n"); printf("|------------------|\n"); for (int i = 1; i < max; i++) { printf("| %3d | %3d번 |\n", (int)number[i], cnt[i]); } printf("\n"); // 중복 제외 출력 printf("<< 중복 제외 출력 >>\n\n"); printf("| 숫자 | 중복 |\n"); printf("|------------------|\n"); for (int i = 1; i < max; i++) { int flag = 0; for (int j = 1; j < i; j++) { if ((int)number[i] == (int)number[j]) { flag = 1; break; } } if (flag) continue; printf("| %3d | %3d번 |\n", (int)number[i], cnt[i]); } printf("\n"); return 1; }
댓글을 사용할 수 없습니다.