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
int j = rand() % n * m
int k = (rand() % n + m) * x
int l = rand() % n * m + x
ex 1) rand() % 4 + 1 의 범위는 1, 2, 3, 4 (연속된 수)
ex 2) rand() % 4 * 2 의 범위는 0, 2, 4, 6 (짝수, 2의 배수)
ex 3) (rand() % 4 + 2) * 3 의 범위는 0, 6, 12, 18 (6의 배수)
ex 4) rand() % 4 * 2 + 1 의 범위는 1, 3, 5, 7 (홀수)
4. array와 rand() 응용 사용법 (1)
// int arr[MAX] = {MAX개 원소}
int arr[4] = {1, 22, 389, 456789};
// 배열의 특정 값을 랜덤으로 불러오기
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)
{
ing 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;
}
중복 제외 출력
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");
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");
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;
}