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