1. 문제

 

7. 다음과 같은 static 멤버를 가진 Random 클래스를 완성하라(Open Challenge 힌트 참고). 그리고 Random 클래스를 이용하여 다음과 같이 랜덤한 값을 출력하는 main() 함수도 작성하라. main()에서 Random 클래스의 seed() 함수를 활용하라.

 

 

 

2. 결과

 

 

 

3. 코드

 

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

class Random {
public :
	static void seed() { srand( (unsigned)time(0) ); }
	static int nextInt(int min=0, int max=32767 ) { 
		int n = min + (rand() % (max-min+1) ); 
		return n; 
	}
	static char nextAlphabet();
	static double nextDouble();
};
char Random::nextAlphabet() {
	int n = rand() % 2;
	if( n == 0) {
		n = 65 + rand() % 26;
		return n;
	}
	else {
		n = 97 + rand() % 26;
		return n;
	}
}
double Random::nextDouble() {
	double n = rand() / (double)(RAND_MAX+1);

	return n;
}

int main() {
	Random::seed();
	int i;

	cout << "1에서 100까지 랜덤한 정수 10개를 출력합니다" << endl;
	for(i=0; i<10; i++) cout << Random::nextInt(1, 100) << ' ';

	cout << endl << "알파벳을 랜덤하게 10개를 출력합니다" << endl;
	for(i=0; i<10; i++) cout << Random::nextAlphabet() << ' ';

	cout << endl << "랜덤한 실수를 10개를 출력합니다" << endl;
	for(i=0; i<5; i++) cout << Random::nextDouble() << ' ';
	cout << endl;
	for(i=0; i<5; i++) cout << Random::nextDouble() << ' ';
	cout << endl;

}

 

 

4. 설명

 

- nextInt()함수는 랜덤한 정수를 구하는 함수 입니다.

 

 이전 글들에서도 설명한적이 있듯이 범위가 min ~ max의 랜덤한 수를 구하기 위해서는

 

int n = min + ( rand() % (max-min+1) );

을 해주셔야 합니다.

=> 이러한 이유는 간단하게 말하자면 rand() % 100 은 rand()가 어떤 랜덤한 수가 와도 나머지이므로 결과는 0~99 사이의 값 입니다. 이 사실을 이해하셨다면 스스로 범위를 잘 조절할 수 있으실 겁니다.

 

 

- nextAlphabet() 함수는 랜덤한 알파벳을 리턴하는 함수입니다.

 

 랜덤한 알파벳인데 소문자인지 대문자인지도 랜덤하게 결정되므로 우선 

 
int n = rand() % 2;

 

를 하여서 0과 1중 랜덤하게 변수 n의 저장합니다.

 

=> 그 다음 0일 경우는 65~90 무작위 대문자를 return 합니다. 또한 1일 경우 97~122 무작위 소문자를 return 합니다.

 

이러한 방법으로 랜덤하게 알파벳을 구할 수 있습니다.

 

 

- nextDouble() 함수는 범위가 0 이상 1미만인 랜덤한 실수를 return하는 함수입니다.

 

double n = rand() / (double)(RAND_MAX+1);

을 하면 0이상 1미만의 무작위 실수를 구할 수 있습니다.

 

=> RAND_MAX는 헤더파일 cstdlib의 정의 되어 있으므로 랜덤 값 중 최대 값 32767을 저장하고 있습니다. 그래서 +1을 해주어서 1미만의 값이 나오도록 합니다.

 

+ Recent posts