반응형

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

<코드>

#include <iostream>

#include <ctime> //time 함수 사용 위함

#include <stdlib.h> //rand, srand, RAND_MAX 사용 위함

 

using namespace std;

 

class Random{

public:

        static void seed(){srand((unsigned)time(0));} //현재 시간으로 랜덤 시드 초기화

        static int nextInt(int min=0, int max=32767); //디폴트 매개변수 min=0, max=32767(RAND_MAX)

        static char nextAlphabet();

        static double nextDouble();

};

int Random::nextInt(int min, int max){ //함수 구현시 디폴트 매개 변수 다시 입력하지 않는다.

        return rand()%(max-min+1)+min; //min 이상 max 이하 랜덤 출력

}

char Random::nextAlphabet(){ //'A'=65 'Z'=90 'a'=97'z'=122

        if(rand()%2) //1이면 대문자

        return rand()%(26)+65; //대문자 리턴

        else //아니면 소문자

        return rand()%(26)+97; //소문자 리턴

}

double Random::nextDouble(){ //실수로 강제형변환한 rand 최대 나올수 있는 수를 실수로 형변환 것으로 나눠준다

        return (double)rand()/(double)RAND_MAX; //RAND_MAX rand함수가 반환하는 가장 (32767)

}

 

int main(void){

        int i;

        Random::seed(); //시드 초기화

        cout<<"1에서 100까지 랜덤한 정수 10개를 출력합니다."<<endl;

        for(i=0;i<10;i++){cout<<Random::nextInt(1,100)<<" ";}

        cout<<endl;

        cout<<"알파벳을 랜덤하게 10개를 출력합니다."<<endl;

        for(i=0;i<10;i++){cout<<Random::nextAlphabet()<<" ";}

        cout<<endl;

        cout<<"랜덤한 실수를 10 출력합니다."<<endl;

        for(i=0;i<10;i++){cout<<Random::nextDouble()<<" ";}

        cout<<endl;

 

        return 0;

}

<결과창>

 

                                  


반응형

'컴퓨터 & 프로그래밍 & 전자공학 > C++' 카테고리의 다른 글

Matrix class  (0) 2017.12.25
Trace 클래스  (0) 2017.12.25
배열 빼기  (0) 2017.12.25
동일한 크기의 배열  (0) 2017.12.25
생성자 오버로딩의 디폴트 매개변수로의 변환  (0) 2017.12.25
반응형

랜덤 수를 발생시키는 Random 클래스를 만들자. Random 클래스를 이용하여 랜덤한 정수를 10개 출력하는 사례는 다음과 같다. Random 클래스가 생성자, next(), nextInRange() 3개의 멤버 함수를 가지도록 작성하고 main() 함수와 합쳐 하나의 cpp파일에 구현하라.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
 
class Random {
public:
    Random() {
        srand((unsigned)time(0)); //다른 랜덤수를 발생시키기 위한 seed 설정
    }
    int next() {
        return rand();
    }
    int nextInRange(int a,int b) {
        return ((rand() % (b - a + 1)) + a); //a이상 b미만 랜덤 정수를 뽑는 알고리즘
        
    }
};
 
int main(void) {
    Random r;
    int i;
    cout << "-- 0에서 " << RAND_MAX << "까지의 랜덤 정수 10개--" << endl//RAND_MAX=32767 상수
    for (i = 0; i < 10; i++) {
        cout << r.next() << " ";
    }
    cout << "\n\n";
    cout << "-- 2에서 " <<  "4까지의 랜덤 정수 10개--" << endl;
    for (i = 0; i < 10; i++) {
        cout << r.nextInRange(2,4<< " ";
    }
    cout << endl;
    return 0;
}
cs



5미만의 수를 rand 출력하려면 4의 나머지를 출력하면 된다. (0~3)

여기서 3~6을 출력하고싶으면 위의 값에 3을 더해주면 된다. 그런데 우리가 가진 인자는 3,6이기 때문에

4를 3,6으로 표현해야 한다. 0~4 = 4개 3~6= 4개 숫자이다. 즉 우리가 원하는건 3~6에 존재하는 숫자 개수이기 때문에

6-3+1을 해주면 된다. 

3미만의 수를 rand 출력하려면 3의 나머지를 출력하면 된다. (0~2)

여기서 2~4를 출력하고 싶으면 4-2+1을 통해 나눠주는 수를 구하고 결과 값에 2를 더해주면 된다.

즉 일반적으로 표현했을 때 a~b 사이 랜덤 정수를 출력하고 싶으면

rand%(b-a+1)+a 를 해주면 되는 것이다.




반응형

'컴퓨터 & 프로그래밍 & 전자공학 > C++' 카테고리의 다른 글

EvenRandom 클래스  (0) 2017.10.12
Oval (사각형에 내접하는 타원) 클래스  (0) 2017.09.21
별 출력  (0) 2017.09.09
1부터 10까지 더하기  (0) 2017.09.09
개인정보 출력  (0) 2017.09.09
반응형

임의의 실수 100개를 생성시킨 후에 텍스트 파일과 이진 파일로 저장하여 보고 그 크기를 비교하여 보라.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define SIZE 100
int main(void)
{
    FILE *fp1=NULL;
    FILE *fp2=NULL;
    int i;
    double arr[SIZE];
    srand((unsigned)time(NULL));
 
    if((fp1=fopen("first.bin","wb"))==NULL)
    {
        printf("파일 오픈 실패1\n");
        exit(1);
    }
    if((fp2=fopen("abc.txt","w"))==NULL)
    {
        printf("파일 오픈 실패2\n");
        exit(1);
    }
    for(i=0;i<SIZE;i++)
    {
        arr[i]=(double)rand()/RAND_MAX; //RAND_MAX는0xfff(32767) 이다. 
    } //c언어의 rand 함수는 0에서 32767을 반환한다. (double)rand();를사용하면 이진파일과 텍스트파일의 크기가 달라진다.
    fwrite(arr,sizeof(double),SIZE,fp1);
    for(i=0;i<SIZE;i++)
    {
        fprintf(fp2,"%lf",arr[i]);
    }
    fclose(fp1);
    fclose(fp2);
    return 0;
 
}
cs





rand 함수를 다르게 다용하면 텍스트 파일과 바이너리 파일의 크기가 다르게 생성되는 경우가 있습니다. 그 이유는 바이너리 상의 특정 문자가

텍스트로 저장될 때 2byte로 저장되기 때문입니다. 줄바꿈 문자인데, 이것 때문에 몇바이트, 많으면 몇십바이트씩 차이가 생기게 됩니다.

따라서 데이터베이스를 저장할 때는 꼭 바이너리 형태로 저장을 하도록 합시다.

참고 블로그 주소 : http://snbosoft.tistory.com/entry/%EB%B0%94%EC%9D%B4%EB%84%88%EB%A6%ACBinary-%ED%85%8D%EC%8A%A4%ED%8A%B8Text-%ED%8C%8C%EC%9D%BC%EC%9D%98-%EC%B0%A8%EC%9D%B4



반응형

'컴퓨터 & 프로그래밍 & 전자공학 > C언어' 카테고리의 다른 글

단어 바꾸기  (0) 2017.02.18
특정 단어 찾기  (0) 2017.02.18
도서 관리 프로그램  (0) 2017.02.17
줄 번호 붙이기  (0) 2017.02.17
사용자 입력 텍스트 파일 저장  (0) 2017.02.13

+ Recent posts