자바를 활용한 로또 번호 6개 뽑기.
tool : eclipse
jdk : 1.7.0
45개중 단순히 번호 6개 뽑아주는 알고리즘이다.
첫 알고리즘이다.
그럭저럭 자알 돌아간다.
헌데 문제가 생겼다.
위 알고리즘을 잘 분석해보면 실제 로또와 다르다.
위 알고리즘은 1~ 45난수를 6개 뽑느데 첫번 뽑은것과 두번 뽑은것이 겹치면 두번째를 다시 뽑는다.
하지만 실제 로또는 45개의 공 중에서 첫번째로 4번 공이 나오면 두번째에는 4번 공이 다시는 나올 수 없다.
이를 생각하면 위 알고리즘은 현실의 로토와 밥벙이 다르다고 생각된다.
그래서 아래의 알고리즘을 고안하게 되었다.
방법은 이렇다.
미리 45개의 배열 nArr[] 에 로토번호(1~45)를 넣어두고,(연속번호든, 섞어서 넣던 결과는 같다)
1~45 사이의 난수를 발생시켜
첫번째 번호를 배열의 인덱스 값으로 뽑는다.
첫번째 로토번호 = nArr[1~45난수] 이다.
예를들어 난수가 4가 나왔으면
첫번 로또 값은 nArr[4] 가 된다.
여기서부터 달라진다.
이제 nArr[4] 의 값을 사용했으므로 다음번엔 다시 이번호가 나오면 안된다.
따라서
해당 인덱스 값을 기준으로 (여기에서는 4)
인덱스값 4 이후부터는 한칸씩 앞으로 땅겨준다.
다시말해
1 2 3 4 5 6 7 8 ..... 43 44 45 의 배열이 1개의 숫자를 뽑고 난 후에는
1 2 3 5 6 7 8 9...... 43 44 45 가 되는 것이다.
그리고 두번째 번호를 추출한다. 이번엔 1~44 사이의 난수를 발생시키면 된다.
이 난수(이번엔 10)를 인덱스로 하는 배열값을 2번째 로또번호로 넣어주고,
nArr배열에서 10번째 인댁스 뒤를 기준으로 다시 앞으로 한칸씩 당겨준다.
이렇게 6번 반복하면 뽑을때마다 정말 로토 확률처럼
1번째볼은 1/45 의 확률 , 두번째볼은 1/44, 세번째 1/43 이렇게 줄어들게되어
정말 로토와 같은 확률의 프로그램이 된다.
아래는 지금까지 설명한 두번째 코드
그리고 마지막, 세번째
자바 api 인 collection 과 suffle 을 사용하면 매우 간단하게 만들수 있다.
이것을 여러분의 몫이다.