ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA/자바] 제비뽑기 확률 조정 [가변배열/배열]
    Language/Java 2018. 3. 14. 09:36
    반응형

    제비뽑기 (확률 조정 가능)

    만들고 싶은 기능

    1. 가변배열 ( = Collection/Map ) 을 사용한다.

    2. 메모장에 이름을 입력하여 , 추가 및 제거 , 

        즉 수정을 손쉽게 할 수 있어야 한다.

    3. 랜덤으로 선정한다.

    4. 확률을 조작할수 있어야 한다.


    알고리즘(순서&절차)

       (1) 파일을 불러온다

       (2) 파일의 이름과 확율을 나눠서 변수 저장한다

       (3) 랜덤 숫자를 뽑아서 그것에 맞는 idx의 당첨자 출력

    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    import java.io.*;
    import java.util.*;
     
    class DSG2{        // Drawing Straws Game 2
        String fileName = "NameList.txt";
        FileReader fr;
        BufferedReader br;
        Random random = new Random();
        String name;
        int rate;
        
        Vector<String> vtNameList = new Vector<String>();    // Vector Name List
     
        void checkSize(){
            String line = null;
            try{
                fr = new FileReader(fileName);
                br = new BufferedReader(fr);
                int size = 0;
                while((line=br.readLine()) != null){
                    line = line.trim();
                    if(line.length() != 0){
                        if((line.indexOf(" ")) != -1){
                            name = separate(line);
                            vtNameList.add(name);    // 숫자를 가진 사람
                        }else{
                            vtNameList.add(line);    // 숫자가 없는 사람
                        }
                        size++;
                    }
                }
            }catch(FileNotFoundException fnfe){
                System.out.println(fileName + " : CAN'T FOUND");
            }catch(IOException ioe){}
        }
     
        String separate(String str){
            int idx = str.indexOf(" ");
            name = str.substring(0 , idx);
            //System.out.println("name : " + name); // 숫자가 있는 이름 확인용
            String rStr = str.substring(idx);
            rStr = rStr.trim();
            try{
                rate = Integer.parseInt(rStr);
                if(rate < 0){
                    System.out.println("확률이 0보다 작아서 0으로 설정합니다. : " + rate);
                    rate = 0;
                }else if(rate > 100){
                    System.out.println("확률이 100보다 커서 100으로 설정합니다. : " + rate);
                    rate = 100;
                }
                //System.out.println("rate 확인 : " + rate); // 숫자 확인
            }catch(NumberFormatException nfe){
                System.out.println("파일의 확률이 잘못 되었습니다.");
            }
            return name;
        }
     
        void ran100(){
            int ran = random.nextInt(100);
            //System.out.println("ran : " + ran); // 랜덤 확인용
            if(ran < rate){
                System.out.println("당첨자 : " + name);
            }else{
                vtNameList.remove(name);
                ran = random.nextInt(vtNameList.size());
                System.out.println("당첨자 : " + vtNameList.get(ran));
            }
        }
     
        public static void main(String[] args){
            DSG2 dsg2 = new DSG2();
            dsg2.checkSize();
            dsg2.ran100();
        }
    }
    cs



    6 , 7 줄 → 17 , 18 줄

    IO 입출력이다. 

    FileReader fr = new FileReader(fileName); 으로 

    fileName = "NameList.txt"; 을 읽는다.


    BuffredReader br = new BufferedReader(fr); 은 fr 

    즉 메모장으로 읽은 FileReader 을 BufferedReader 로 읽어서, 

    cmd 창에서 출력해주는 역할을 한다.



    37줄

    String separate(String str){} 메소드는 인덱스를 확인하고 , 

    확률 또한 확인하는 메소드이다.


    JJJJ 의 확률은 60 이다.

    그래서 ran 이 60 개의 방을 할당하여 , 60 밑이라면 JJJJ가 나오게 된다.

    그리고 ran 이 60 이상이라면 JJJJ이외의 나머지 인원들에서 랜덤을 돌리게 된다.


    65줄

    vtNameList.remove(name); 은 확률이 있는 사람의 이름을 지우는 것이다.


    1. IO ( FileReader , BufferedReader ) 을 배우기.

    2. try{}catch(){} 예외처리 배우기.

    3. while{} 반복문 배우기.

    4. if{} 조건문 배우기.

    5. Collection 가변배열 배우기.

    6. Random 함수 배우기.

    7. 제비뽑기 예제 보기.


    반응형
Designed by Tistory.