ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA/자바] 제비뽑기 확률 조정 100% 까지 [가변배열/Vector/ArrayList]
    Language/Java 2018. 3. 14. 22:05
    반응형


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

    만들고 싶은 기능

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

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

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

    3. 랜덤으로 선정한다.

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

    5. 각각 확률의 합계는 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
    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
    import java.io.*;
    import java.util.*;
     
    class DSG3{        // Drawing Straws Game 3
        String fileName = "NameList.txt";
        FileReader fr;
        BufferedReader br;
        Random random = new Random();
        
        String name;
        int rate;
     
        Vector<String> listName = new Vector<String>();            // 확률이 없는 사람
        ArrayList<String> listNumber = new ArrayList<String>();    // 확률이 있는 사람
     
        void readFile(){
            String line = null;
            try{
                fr = new FileReader(fileName);
                br = new BufferedReader(fr);
                while((line=br.readLine()) != null){
                    line = line.trim();
                    if(line.length() != 0){
                        if((line.indexOf(" ")) != -1){
                            name = separate(line);
                            listName.add(name);
                        }else{
                            listName.add(line);
                        }
                    }
                }
            }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();
            rate = Integer.parseInt(rStr);
            for(int i=0 ; i<rate ; i++){
                listNumber.add(name);
            }
            return name;
        }
     
        void ran100(){
            int ran = random.nextInt(100);
            //System.out.println("확률 : " + listNumber.size() + "\n번호 : " + ran);
            if(ran < listNumber.size()){
                if(listNumber.size() > 100){
                    System.out.println("확률이 100을 넘을 수 없습니다." + ran);
                    System.out.println("메모장의 확률의 합을 확인해주세요.");
                    System.exit(0);
                }else{
                    System.out.println("당첨자 : " + listNumber.get(ran));    // 확률있는 당첨자
                }
            }else{
                listName.remove(name);
                ran = random.nextInt(listName.size());
                System.out.println("당첨자 : " + listName.get(ran));        // 확률없는 당첨자
            }
        }
     
        public static void main(String[] args){
            DSG3 dsg3 = new DSG3();
            dsg3.readFile();
            dsg3.ran100();
        }
    }
    cs




    우선은 이 그림에 대해 설명을 해보자면

    AAA , BBBB , CCC , DDDD , EEE , FFFF 총 6명에게 확률을 각각 20%씩 주었다.

    6 * 20 = 120 이기때문에 확률이 100 초과이기에 랜덤을 돌리지 않는다.




    그리고 이번 그림에 대해서 설명을 해보자면 ,

    확률이 어떤씩으로 적용이 되는지 말해보고자 한다.

    각 20% 씩이기 때문에 Vector 배열에 20개의 방씩 추가한다.

    그리하여 0~19 = 20개는 AAA 가 출력되는 형식이다.

    위의 그림은 31 이 나왔기 때문에 , 20 ~ 39 = 20 개의 방을 가지고 있는

    BBBB가 당첨이 된 것이다.




    이 그림은 0~19 = 20개의 방을 가진 경우에는 AAA 가 확정으로 나오게 되고,

    그 외의 경우에는 숫자를 가진 사람을 지우고 공평하게 랜덤으로 돌리는 형식이다.


    나머지 각각의 줄의 대한 설명은

    가변배열을 2개 넣은것 주석처리한 것을 제외한다면 ,

    지난시간에 작성했던 포스트의 내용과 그리 다른것이 없다.

    한번 보면서 곰곰히 생각해 본다면 ,

    아! 이 로직은 이런 내용이구나.. 이렇게 바꿔도 되겠는데??

    라는 생각이 들지도 모른다.


    로직에 관해서는 정답이 없다고 생각하기 때문에,

    실습예제를 보지 않고 , 스스로 해보는 것이 실력 향상에 좋다고 생각한다.


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

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

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

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

    5. Collection 가변배열 배우기.

    6. Random 함수 배우기.

    7. 제비뽑기 예제 고정배열 보기.

    8. 제비뽑기 예제 가변배열 보기.


    반응형
Designed by Tistory.