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", rand() % 44 + 1);
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;
}