'엑셀 로또'에 해당되는 글 1건

  1. 2015.12.05 [엑셀 VBA #17] 중복되지 않는 난수 랜덤 추출하기

[엑셀 VBA #17] 중복되지 않는 난수 랜덤 추출하기






본 강의에서는 겹치지 않는 난수를 추출하는 방법에 대해 알아보겠습니다.


난수를 추출하는 것은 Rnd 구문으로 쉽게 처리할 수 있지만 난수를 중복되지 않게 처리하려면 일련의 과정을 거쳐야 합니다.






RND 함수


Rnd 함수는 0부터 1 사이의 소수 난수를 생성합니다. (0.00000...1 ~ 0.99999...9)



INT 함수


Int 함수는 인수로 지정된 숫자의 정수부분만을 추출합니다.



원하는 만큼 정수 난수 생성하기


Rnd 함수와 Int 함수를 사용하면 원하는 만큼 정수 난수를 생성할 수 있습니다.


Int(Rnd * 정수 최대값) + 1


예를 들어, Int(Rnd * 50) 는 0에서 49까지의 정수를 반환합니다.


그 값에 1을 더하게 되면 1에서 50까지의 정수를 반환하게 됩니다.





예제 : 로또 번호 추출기 만들기


이번 예제는 7개의 서로 다른 번호(로또)를 추출하는 예제입니다.


Rnd, Int함수와 지난 강의에서 배웠던 배열 오름차순 정렬(버블정렬), 그리고 숫자가 중복되지 않게 하는 방법이 사용됩니다.




Sub example_12()


Dim lotto(1 To 7) As Integer

Dim i As Integer

Dim a As Integer

Dim ii As Integer

Dim n As Integer

Dim m As Integer

Dim sorttemp As Integer


i = 1                


For i = 1 To 7                    '로또 번호가 7개이기 때문에 7번 반복해서 난수 추출


restart:


Randomize                        '난수 재생성

   a = Int(Rnd * 50) + 1        '난수 a 생성(1~50)


lotto(i) = a                        'lotto배열의 각 항에 난수값 입력

            


            For ii = LBound(lotto) To (i - 1)        '첫 난수부터 지금 추출된 난수의 전값(i - 1)까지 반복

                Select Case lotto(ii)             '즉 lotto배열의 마지막 값(지금 추출한 난수)과 이전 난수를 반복 비교

                    Case lotto(i)

                  GoTo restart                    'lotto(ii) 이전 난수값과 lotto(i) 지금 추출한 난수값이 같으면 restart로 이동

                End Select

            Next ii                    '여기까지 중복값 배제하는 코드


Next i



'여기부터 난수 오름차순 정렬(버블정렬) 이해가 안가면 전강의 보세요.

'정렬이 필요가 없다면 아래 For~Next 부분은 전부 삭제해도 무방합니다.

For n = 1 To UBound(lotto) - 1            

    

    For m = 1 To UBound(lotto) - n

        If lotto(m) > lotto(m + 1) Then

            sorttemp = lotto(m + 1)

            lotto(m + 1) = lotto(m)

            lotto(m) = sorttemp

        End If

    

    Next m


Next n                                                '버블정렬 종료


Cells(3, 1).Resize(, UBound(lotto)) = lotto        '세로1 가로7의 배열을 셀에 입력



End Sub



위 코드를 실행하면,




위와 같이 각기 다른 난수를 오름차순으로 추출할 수 있습니다.






저의 강의는 순차적으로 난이도를 높혀가고 있습니다.


강의가 이해가 안된다면 처음 강의부터 차근차근 공부하면 쉽게 이해할 수 있습니다.














Posted by Simon K
: