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;
}