프로그램을 만들다보면 숫자를 랜덤으로 만들어내야 할 때가 있습니다. 이번 포스팅은 C언어와 C++에서 랜덤으로 숫자를 추출하는 방법과 여러 예제를 살펴보겠습니다.


1. rand 함수의 기본 사용 방법


rand 함수를 사용하면 랜덤으로 숫자를 출력할 수 있습니다.


함수 원형은 아래와 같습니다. 

int rand(void)


#include<stdlib.h>로 stdlib.h 헤더파일에 해당 선언이 적혀있습니다. 


해당 함수는 0 부터 32767까지의 숫자 중 하나를 랜덤으로 뽑아냅니다.


여기에 % 연산자를 사용하여 원하는 숫자의 범위를 정합니다.


예를들어 rand() % 10 을 하면 0부터 9까지의 숫자중 하나가 나오게 됩니다.


만약 5부터 10까지의 숫자 중 를 랜덤으로 추출하고 싶다면 


rand() % 6 + 5 를 하면 됩니다. rand() % 6 을 하면 0부터 5까지의 숫자 중 하나이고 거기에 +5를 하면 5부터 10까지의 숫자중 하나가 됩니다.


이렇게 하면 자신이 원하는 숫자를 랜덤으로 추출할 수 있습니다.


아래 사용예제 입니다. 0부터 99까지의 숫자중 랜덤으로 변수 num에 저장하여 출력합니다.

총 3번을 반복합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
#include <stdlib.h>
 
void main() 
{        
    int num;
    num = rand() % 100;
    printf("rand : %d\n", num);
    num = rand() % 100;
    printf("rand : %d\n", num);
    num = rand() % 100;
    printf("rand : %d\n", num);
}
cs


- 출력결과 -

rand : 41

rand : 67

rand : 34




2. srand 함수를 사용하여 프로그램을 실행할 때마다 다른 난수 출력하기


 하지만 이상한 것은 프로그램을 실행 할 때마다 매번 같은 숫자가 나오게 됩니다.

이것은 프로그램을 실행할 때마다 항상 난수표에 같은 지점에서부터 숫자를 추출하기 때문입니다.

난수표라는 것은 글 가장 마지막에 설명을 써놓았습니다.


 그래서 프로그램을 실행할 때마다 숫자가 다르게 나오게 하고 싶다면 srand 함수를 이용해야 합니다.

아래 함수의 원형 입니다.


void srand( unsigned int seed );


 seed값을 받아 난수표에 시작 지점을 바꾸는 것 입니다. 보통은 seed로 현재의 시간을 unsigned int 로 변환하여 사용하게 됩니다. 그러면 프로그램을 시작하는 시간이 계속 달라지기 때문에 프로그램을 실행할 때마다 다른 수가 추출되게 됩니다.


srand 함수를 사용하기 위해서는 #include<time.h>를 추가하여야 합니다.


아래 사용예제 입니다. 위의 예제와 같지만 프로그램이 시작할때 scanf() 를 사용합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
 
void main() 
{        
    int num;
    srand(time(0));
    num = rand() % 100;
    printf("rand : %d\n", num);
    num = rand() % 100;
    printf("rand : %d\n", num);
    num = rand() % 100;
    printf("rand : %d\n", num);
}
cs


출력결과가 매번 다릅니다.




3. 알파벳 랜덤으로 출력


아래 예제는 응용한 것으로 알파벳 소문자 a부터 z중 하나를 출력하는 예제입니다.

알파벳 개수가 26개기 때문에 rand() % 26 을하고 +'a' 를 합니다. 아스키2 코드를 이용 하는 것입니다.

그러면 a부터 z중 하나의 숫자가 출력됩니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
 
void main() 
{        
    int i;
    char ch;
    srand(time(0));
    for (i = 0; i < 10; i++) {
        ch = rand() % 26 + 'a';
        printf("rand : %c\n", ch);
    }
}
cs


- 출력결과 -

rand : e 

rand : s 

rand : b 

rand : f 

rand : i 

rand : p 

rand : n 

rand : b 

rand : j 

rand : d 






4. 로또 번호 추첨


1부터 45까지의 숫자를 중복없이 6개 출력하는 로또 번호추첨 예제이다. 


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
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
 
#define MAX 45 //1부터 45 숫자
#define NUMBER //6개 숫자출력
 
void main() 
{        
    int i, tmp;
    int save[NUMBER];
    int count = 0;
    int isSame = 0;
    srand(time(0));
    
    //숫자 추출
    while (count < NUMBER) {
        isSame = 0;
        tmp = rand() % MAX + 1;//1부터 45 출력
        for (int i = 0; i < count; i++) { //중복검사
            if (tmp == save[i]) { //중복이 있을때
                isSame = 1;
                break;
            }
        }
        if (isSame == 0) { //중복없음
            save[count] = tmp;
            count++;
        }
    }
 
    //결과 출력
    printf("추첨 숫자 : ");
    for(i =0; i < NUMBER; i++)    
        printf("%d ", save[i]);
    printf("\n");    
}
cs


- 출력결과 -

추첨 숫자 : 35 15 29 19 27 38




5. 프로그래밍 언어에서 난수(랜덤)란?


 추가로 사실 대부분에 프로그램에서 사용하는 랜덤 함수들은 정밀하게는 완벽한 랜덤이 아닙니다. 난수표 라고해서 특성 숫자들이 적힌 테이블이 있는데 이 테이블들을 순서대로 출력하는 것 입니다. 

 예를들어 1 5 4 2 0 3 7 6 란 숫자가 있으면 1을 선택하고 그 다음에는 5를 선택하고 이런식으로 차례대로 숫자를 선택합니다. 이와 같은 방식으로 C와 C++에서는 0부터 32767 까지의 숫자들이 난수표에 적혀 있습니다. 그래서 엄밀하게는 완벽한 랜덤이라고 할 수 는 없습니다.

 따라서 보안이 중요한 곳이나 이런데서는 랜덤함수를 사용할때 주의가 필요합니다. 랜덤함수를 사용하여 추출한 결과를 보면 다음 수를 예측하거나 하는 방법으로 해킹등을 할 수도 있기 때문입니다.

Posted by 꿈만은공돌
,

JAVA에서 File CLASS는 파일이 존재하는지, 디랙토리가 존재하는지, 사이즈가 몇인지 등을 알 수 있는 편리한 클래스 입니다. 특별한 라이브러리 추가 없이 사용가능하기 때문에 편리합니다.

특히 특정 폴더 밑에 모든 파일들을 삭제하거나 검색하는 등에 기능으로 사용하기 좋습니다.



우선 import java.io.File; 로 import를 시킵니다.


1. exists 함수

파일이 존재하는지 여부를 알 수 있습니다.

반환결과가 boolean으로 파일이 존재하면 참, 없으면 거짓을 반환 합니다.


1
2
3
4
5
6
File f = new File("C://test/a.txt");
if(f.exists()) {
     System.out.println("파일 존재");
else {
      System.out.println("파일 없음");            
}
cs


2. length 함수

file의 사이즈를 측정하는 함수 입니다. 바이트 사이즈 크기를 변수타입 long으로 반환합니다. 


1
2
3
4
5
6
7
    File f = new File("C://test/a.txt");
    if(f.exists()) {
        long len = f.length();
        System.out.println("file Size : " + len);
    } else {
        System.out.println("파일 없음");            
    }
cs



3. isFile 함수

파일인지를 검사하는 함수입니다. 파일이 존재하지 않거나 디렉토리이면 false를 반환, 파일이면 true 반환합니다.


1
2
3
4
5
6
    File f = new File("C://test/");
    if(f.isFile()) {
        System.out.println("파일");  
    } else {
        System.out.println("파일이 아님");            
    }
cs



4. isDirectory 함수

디렉토리인지를 검사하는 함수 입니다. 디랙토리이면 true를 반환하고 파일이거나 존재재하지 않으면 false를 반환합니다.


1
2
3
4
5
6
    File f = new File("C://test/");
    if(f.isDirectory()) {
        System.out.println("디랙토리");  
    } else {
        System.out.println("디랙토리 아님");            
    }
cs



5. isHidden 함수

숨김파일인지를 검사하는 함수 입니다. 파일이나 디랙토리가 숨김으로 되어있으면 true를 반환하고 아니면 false를 반환합니다.


1
2
3
4
5
6
File f = new File("C://test/a.txt");
if(f.isHidden()) {
    System.out.println("숨겨진 파일");  
else {
    System.out.println("숨겨진 파일이 아님");            
}
cs


6. getName 함수

파일에 이름을 반환하는 함수 입니다. 앞에 파일 경로를 제외하고 파일이름만 String 타입으로 반환 합니다.


1
2
3
4
5
File f = new File("C://test/a.txt");
if(f.isFile()) {
    String name = f.getName();
    System.out.println("File Name : " + name);
}
cs


7. getPath 함수

파일의 전체 경로와 이름을 반환하는 함수 입니다.


1
2
3
4
5
File f = new File("C://test/a.txt");
if(f.exists()) {
   String path = f.getPath();
   System.out.println("File Path : " + path);
}
cs



8. listFiles 함수

해당 디랙토리 아래 어떤 파일이나 디렉토리들이 있는지를 반환하는 함수 입니다.

File배열로 반환합니다. 아래 예제를 보면 C://test/ 디렉토리 아래에 있는 모든 파일과 디렉토리를 반환하게 됩니다.


1
2
3
4
5
6
File f = new File("C://test/");
if(f.isDirectory()) {
    File[] fList = f.listFiles();
    for(int i=0; i < fList.length; i++)
        System.out.println(fList[i].getName());
}
cs


9. mkdir 함수

디랙토리 만들기 함수 입니다. 아래 예제대로면 C://test/test2 로 test2 디렉토리를 를 만들게 됩니다.

그러나 C://test 폴더가 존재하지 않으면 실패하게 됩니다. 이럴땐 mkdirs을 사용해야합니다.

결과로 성공여부를 boolean 을 반환합니다.


1
2
3
4
5
6
7
File f = new File("C://test/test2");
boolean result = f.mkdir();
if(result)
   System.out.println("디렉토리 만들기 성공");
else
   System.out.println("디렉토리 만들기 실패");
 
cs




10. mkdirs 함수

위의 9번 mkdir과 거의 같은 기능을 하지만 C://test/test2 에서 상위 폴더들이 없으면 상위폴더들까지 만들게 됩니다.


1
2
3
4
5
6
7
File f = new File("C://test/test2");
boolean result = f.mkdirs();
if(result)
   System.out.println("디렉토리 만들기 성공");
else
   System.out.println("디렉토리 만들기 실패");
 
cs



이외에도 몇가지더 존재하지만 대부분 함수이름을 보면 기능이나 사용방법을 추측해볼 수 있습니다.



Posted by 꿈만은공돌
,



스페인 - 파리 여행 일정 입니다.

2017년 12월 3일부터 총 9박11일 다녀왔습니다.


스페인 : 바르셀로나->세비야->마드리드(세고비야) 6박 7일

파리 :  3박4일


날씨는 스페인에서는 한국보단 조금 따뜻하고 특히나 세비야는 외투가 필요없을정도에 날씨였습니다.

파리는 비가많이오고 그래서 날씨가 좀 쌀쌀했습니다. 한국과 비슷한 정도였던 것 같습니다. 


물가는 스페인은 한국과 비슷한 수준인데 파리는 한국보단 좀더 비싼편이었습니다.


 

 

숙소

시간

일정

 

1일차

 

13:40

18:30

인천공항 출발

바르셀로나 공항 도착

카탈로니아 아빈요

Catalonia Avinyó

2일차

8:50

 

19:00

가우디 투어 (까사 비센스 > 구엘공원 > 까사 바뜨요 > 까사 밀라 > 성바울 병원 > 성가족 성당)

카탈루냐 음악당야경투어 중 선택

3일차

오전

17:55

19:30

바르셀로나 관광(구시가지)

바르셀로나 비행기 탑승

세비야 도착

포사다 델 루세로

Hotel Posada del Lucero

4일차

저녁

세비야 관광(세비야 대성당 -> 스페인광장)

플라맹고 감상(세비야 대성당 근처)

5일차

10:45

13:15

오후

세비야 기차 탑승

마드리드 도착

마드리드 관광(솔광장산 미겔 시장왕립극장왕궁스페인 광장)

7이슬라스 호텔

6일차

9:00

 

저녁

세고비야 당일치기 여행

3호선과 6호선 Moncloa 버스터미널 (몬클로아 역)

마드리드 관광저녁식사

7일차

14:05

16:05

저녁

마드리드 비행기 탑승

파리 도착(파리오를리 공항)

에펠탑 야경

르 마르퀴스 에펠

8일차

08:50

12:00

루브르 오전 투어(3시간)

파리시내 관광(노트르담 성당몽마르트개선문)

9일차

08:30

15:00

17:00

쇼핑

오르세 미술관파리 에펠탑 관광

유람선(바튜무슈)

10일차

13:10

파리(샤를 드 골 공항)에서 출발

11일차

 

08:10

인천 공항 도착

 


Posted by 꿈만은공돌
,