Language/Java

[JAVA/자바] 제비뽑기 확률 조정 [가변배열/배열]

reifier.tistory.com 으로 이전하였습니다. 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. 제비뽑기 예제 보기.


반응형