-
[JAVA/자바] 제비뽑기 확률 조정 100% 까지 [가변배열/Vector/ArrayList]Language/Java 2018. 3. 14. 22:05반응형
제비뽑기 (확률 조정 가능)
만들고 싶은 기능
1. 가변배열 ( = Collection/Map ) 을 사용한다.
2. 메모장에 이름을 입력하여 , 추가 및 제거 ,
즉 수정을 손쉽게 할 수 있어야 한다.
3. 랜덤으로 선정한다.
4. 확률을 조작할수 있어야 한다.
5. 각각 확률의 합계는 100까지 가능하게 한다.
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374import java.io.*;import java.util.*;class DSG3{ // Drawing Straws Game 3String 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 ) 을 배우기.
반응형'Language > Java' 카테고리의 다른 글
[JAVA/자바] 달력 ( Calendar ) 만들기 (3) 2018.03.17 [JAVA/자바] 제비뽑기 다수 인원 뽑기 [가변배열/Vector/Hashtable] (0) 2018.03.15 [JAVA/자바] 제비뽑기 확률 조정 [가변배열/배열] (0) 2018.03.14 [JAVA/자바] 제비뽑기 ( = 룰렛) 예제 [고정배열/Array] (0) 2018.03.11 [JAVA/자바/TIP2] FileReader ( cmd 창에 txt 파일 읽기/출력하기 ) (2) 2018.03.05