본문 바로가기

공부방/C언어 따라하기

[java] 로또 번호 출력 예제

자바를 활용한 로또 번호 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 을 사용하면 매우 간단하게 만들수 있다.

이것을 여러분의 몫이다.

 

 

Lotto.java

 

Lotto2.java