본문 바로가기

강의자료/C/C++

019. 랜덤함수와 스왑기법.

◈ 이 글은 강의를 위하여 제가 직접 작성한 내용입니다. 따라서 퍼가실 경우, 출처를 명확히 해주시기 바랍니다!!
◈ This ariticle was written by me for teaching. So if you want to copy this article, please clarify the source!!


프로그램은, 주어진 명령만을 수행할 뿐이므로 언제나 같은 내용을 수행할 수 밖에 없다.
하지만 그렇다면 프로그램을 사용할 이유가 없게된다. 프로그램을 더욱 프로그램답게 만들어 주는 랜덤함수에 대해서 알아보자.
주어진 명령만을 수행하는 프로그램이 매번 다르게 수행되기 위해서는 실행될때마다 변하는 값이 필요하다.
이 목적에 가장 적합한 값은 바로 시간값이다. 수행될때마다 현재 시간은 다를테니 말이다.
그리고 두 변수의 값을 서로 바꾸는 스왑기법에 대해서도 알아보자.
#include  
#include 
using namespace std;

void main()
{
	int num = 0;

	srand((unsigned)time(0));

	for(int i=0; i<10; i++)
	{
		num = rand();
		cout << num << endl;
	}

	int a = rand() % 101;			// 0~100
	int b = rand() % 100 + 1;		// 1~100
	int c = rand() % 51 + 200;		// 200~250

	// 스왑.
	int m = 5;
	int n = 7;

	int t = m;
	m = n;
	n = t;

	cout << m << " / " << n << endl;
}

#연습문제 : 랜덤값 생성 후 역순으로 스왑하기
#include 
#include 
using namespace std;

void main()
{
	// 배열,랜덤,스왑을 활용한 문제.
	int randnum[10];
	int counts = sizeof(randnum)/sizeof(randnum[0]);

	// randnum배열에 1부터 배열의 크기(개수)사이의 랜덤값을 집어넣은 후 순서대로 출력하시오.
	srand((unsigned)time(0));
	for(int i=0; i < counts; i++)
	{
		randnum[i] = rand()%counts+1;
		cout << randnum[i] << " ";
	}
	cout << endl;

	// 스왑을 이용하여 randnum배열의 값을 역순으로 재정렬한 후 다시 출력하시오.
	// 0 <-> 9, 1 <-> 8, 2 <-> 7, 3 <-> 6, 4 <-> 5
	int last = counts - 1;
	for(int i=0; i < counts/2; i++)
	{
		int temp = randnum[i];
		randnum = randnum[last-i];
		randnum[last-i] = temp;
	}
	for(int i=0; i < counts; i++)
	{
		cout << randnum[i] << " ";
	}
	cout << endl;

}

#연습문제 : 카드 섞기
#include 
#include 
using namespace std;

void main()
{
	// 스왑을 이용하여 ary배열의 값을 랜덤하게 섞은 후 화면에 출력하시오.
	int ary[] = {0,1,2,3,4,5,6,7,8,9}; 
	int counts = sizeof(ary)/sizeof(ary[0]);

	srand((unsigned)time(NULL));
	for(int i=0; i < counts; i++)
	{
		int rnd = rand() % counts;
		int temp = ary[i];       
		ary[i] = ary[rnd];
		ary[rnd] = temp;
	}

	for(int i=0; i < counts; i++)
		cout << ary[i] << "  ";
	cout << endl;
}