반응형

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
반응형

짝수 홀수를 선택할 수 있도록 생성자를 가진 SelectableRandom 클래스를 작성하고 각각 짝수 10, 홀수 10개를 랜덤하게 발생시키는 프로그램을 작성하라.



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
37
38
39
40
41
42
43
44
45
46
#include <iostream>
#include <cstdlib> //atoi,rand,malloc 등의 메소드가 포함된 라이브러리
#include <ctime> //시간과 관련된 메소드, 상수가 포함된 라이브러리
using namespace std;
 
/*rand()함수만 사용하면 무작위 수가 나오기는 하지만 실행할 때마다 같은 무작위 수가 나온다.
왜냐하면 같은 seed값을 이용하기 때문이다.
따라서 srand를 이용해 프로그램을 시작할 때마다 다른 seed값을 넣어주면 매번 다른 무작위 수가 나올것이다.
time 함수는 매 초 다른 값을 반환하기 때문에 seed로 사용하기가 매우 좋다.*/
 
class SelectableRandom {
public:
    SelectableRandom() {
        srand((unsigned)time(0)); //다른 랜덤수를 발생시키기 위한 seed 설정
    }
    int nexteven() { 
        return ((rand()/2)*2);  //2로나눠서 2를 곱하면 범위 그대로 짝수만 나온다.
    }
    int nextodd() { 
        return ((rand()/2)*2)+1;  //2로나눠서 2를 곱하고 1더하면 범위 그대로 홀수만 나온다.
    }
    int nextevenInRange(int a,int b) {
        return (((rand() % (b - a + 1)) + a)/2)*2//범위 짝수
        
    }
    int nextoddInRange(int a,int b) {
        return ((((rand() % (b - a + 1)) + a)/2)*2)+1;    //범위 홀수
    }
};
 
int main(void) {
    SelectableRandom r; //SelectableRandom 클래스의 객체 r
    int i;
    cout << "-- 0에서 " << RAND_MAX << "까지의 짝수 랜덤 정수 10개--" << endl//RAND_MAX=32767 상수
    for (i = 0; i < 10; i++) {
        cout << r.nexteven() << " ";  //10개 랜덤 짝수 정수 출력
    }
    cout << "\n\n";
    cout << "-- 2에서 " <<  "10까지의 홀수 랜덤 정수 10개--" << endl;
    for (i = 0; i < 10; i++) {
        cout << r.nextoddInRange(2,9<< " ";  //범위 내 10개 랜덤 홀수 정수 출력
    }
    cout << endl;
    return 0;
}
 
cs




반응형

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

다수의 클래스 연산자  (0) 2017.10.12
Integer 클래스  (0) 2017.10.12
EvenRandom 클래스  (0) 2017.10.12
Oval (사각형에 내접하는 타원) 클래스  (0) 2017.09.21
랜덤 수 출력  (0) 2017.09.16
반응형

문제 3번을 참고하여 짝수 정수만 랜덤하게 발생시키는 EvenRandom 클래스를 작성하고 EvenRandom 클래스를 이용하여 10개의 짝수를 랜덤하게 출력하는 프로그램을 완성하라. 0도 짝수로 처리한다.


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
37
38
39
40
41
#include <iostream>
#include <cstdlib> //atoi,rand,malloc 등의 메소드가 포함된 라이브러리
#include <ctime> //시간과 관련된 메소드, 상수가 포함된 라이브러리
using namespace std;
 
/*rand()함수만 사용하면 무작위 수가 나오기는 하지만 실행할 때마다 같은 무작위 수가 나온다.
왜냐하면 같은 seed값을 이용하기 때문이다.
따라서 srand를 이용해 프로그램을 시작할 때마다 다른 seed값을 넣어주면 매번 다른 무작위 수가 나올것이다.
time 함수는 매 초 다른 값을 반환하기 때문에 seed로 사용하기가 매우 좋다.*/
 
class EvenRandom {
public:
    EvenRandom() {
        srand((unsigned)time(0)); //다른 랜덤수를 발생시키기 위한 seed 설정
    }
    int next() { //rand()함수는 0~32767 사이 무작위 정수 리턴
        return (rand()/2)*2// rand()의 리턴 밸류는 integer 형이다. 따라서 2로 나눴을 때 무조건정수가 나온다.
    //어떤 정수든 (홀수든 짝수든) 2를 곱하면 짝수가 된다. 그리고 반토막 난 범위도 복원된다.
    }
    int nextInRange(int a,int b) {
        return (((rand() % (b - a + 1)) + a)/2)*2//a이상 b미만 랜덤 정수를 뽑는 알고리즘에 짝수 sifting 알고리즘을 더한다.
        
    }
};
 
int main(void) {
    EvenRandom r; //EvenRandom 클래스의 객체 r
    int i;
    cout << "-- 0에서 " << RAND_MAX << "까지의 랜덤 정수 10개--" << endl//RAND_MAX=32767 상수
    for (i = 0; i < 10; i++) {
        cout << r.next() << " ";  //10개 랜덤 정수 출력
    }
    cout << "\n\n";
    cout << "-- 2에서 " <<  "10까지의 랜덤 정수 10개--" << endl;
    for (i = 0; i < 10; i++) {
        cout << r.nextInRange(2,10<< " ";  //범위 내 10개 랜덤 정수 출력
    }
    cout << endl;
    return 0;
}
 
cs



반응형

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

Integer 클래스  (0) 2017.10.12
SelectableRandom 클래스  (0) 2017.10.12
Oval (사각형에 내접하는 타원) 클래스  (0) 2017.09.21
랜덤 수 출력  (0) 2017.09.16
별 출력  (0) 2017.09.09
반응형

랜덤 수를 발생시키는 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
반응형

6.12> 겜블링 게임을 만들어보자. 두 사람이 게임을 진행한다. 두 사람의 이름은 처음에 키보드를 통해서 입력 받는다. 게임에 참여하는 사람은 Person클래스로 작성하도록 하라. 각 사람이 번갈아 가면서 게임을 진행한다. 각 사람이 자기 차례에서 <Enter> 키를 입력하면 프로그램은 3개의 난수를 발생시키고 이 3개의 숫자가 모두 같은 지 판단한다. 동일하다면 승자가 되며 게임을 끝낸다. 게임은 끝날 때까지 두 사람이 번갈아 가면서 진행한다. 숫자의 범위를 너무 크게 잡으면 3개의 숫자가 일치하게 나올 가능성이 적기 때문에 편리를 위해 숫자의 범위는 0~3까지만 한다.


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
37
38
39
40
41
package SecondHW;
import java.util.*//스캐너 사용 위한 임포트
class Person{String name;} //Person 클래스와 그 원소 문자열 name
public class Gembling {
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in); //스캐너객체 s
        Person p1=new Person(); //Person 객체 를가리키는 레퍼런스 변수 p1
        Person p2=new Person(); //Person 객체 를가리키는 레퍼런스 변수 p2
        int rand[]= new int[3]; //사이즈3의 인트형 배열 rand
        int round=1//int형변수 round 선언 및 1로 초기화
        int who=0//int형변수 who 선언 및 0으로 초기화
        System.out.print("플레이어1의 이름을 입력하세요: ");
        p1.name=s.nextLine(); //p1.name을 nextLine으로 받음(개행문자 미포함)
        System.out.print("플레이어2의 이름을 입력하세요: ");
        p2.name=s.nextLine();//p2.name을 nextLine으로 받음(개행문자 미포함)
        while(true){
            who=round%2//who는 round를 2로나눈 나머지 즉 홀수면 p1, 짝수면 p2
            if(who==1){
                System.out.print(p1.name + "님 차례입니다. 엔터 입력>>");
            }
            else if(who==0){
                System.out.print(p2.name + "님 차례입니다. 엔터 입력>>");
            }
            String check=s.nextLine(); //문자열 check를 nextLine으로 받음(nextLine은 개행 미포함)
            //즉 엔터만 치면 빈 문자열이 됨.
            if(check.isEmpty()){  // isEmpty : 스트링길이0이면true, 아니면 false
                for(int i=0;i<3;i++//3번 반복
                {    rand[i]=(int)(Math.floor(Math.random()*4)); 
                // 균일한 확률을 위해 곱하기 4한 후 내림 사용
                    System.out.print(rand[i]+" ");} //각 원소 출력
                System.out.println();} //3개 출력후개행문자 출력
            if((rand[0]==rand[1])&&(rand[1]==rand[2])) //0번,1번,2번 원소가 전부 같으면
            {if(who==1){ //p1일때
                System.out.println(p1.name+"님의 승리입니다 축하합니다!" );
                break;} //승리축하문자 출력후 루프 탈출
            else if(who==0){//p2일때
                System.out.println(p2.name+"님의 승리입니다 축하합니다!" );
                break;}} //승리축하문자 출력후 루프 탈출
            round++//승리하지못했을시 round증가시키고 루프 반복
        }}}
 
cs






반응형

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

학점 계산  (0) 2017.06.19
가장 큰 수  (0) 2017.06.19
가위바위보  (0) 2017.06.19
대문자 개수 세기  (0) 2017.06.19
메소드 오버라이딩  (0) 2017.06.18
반응형

임의의 실수 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