rand(life)

[vba] 중복없이 9개 단어 무작위 추출 본문

컴퓨터/엑셀

[vba] 중복없이 9개 단어 무작위 추출

flogsta 2017. 6. 16. 09:37

 지식인 질문에 대한 답이다.


나는 만들어진 단어 9개씩의 한 줄도 중복되는 것이 있을거라보고 중복을 없애기 위해 Collection을 이용했는데, 큰형님은 그런 과정 없이 숫자만 100으로 바꾸었다. 

25개 중에서 9개 뽑는 정도로는 쉽게 중복되지 않는 것이라 본 것일까.....

Book1.xls



Sub Macro()

 Dim valR(), T() As Variant

 Dim nc As New Collection

 Dim rng As Range

 Dim i  As Integer, c As Integer, n As Integer, r As Integer

 Dim str As String

 Dim s As Variant

 

  Set rng = Range("B3:B27")

Do Until nc.Count = 100   '콜렉션이 100개가 될때까지

    Randomize             '이 부분이 몰랐던 것인데, Rnd함수의 난수생성기를 초기화하고 시드를 새로 부여한다고 한다. 혹시 이거 하지 않으면 계속 같은 난수가 발생하는 건가 싶어서 테스트를 해봤는데, 그러지는 않았다. 이유를 잘 모르겠다. 

  ReDim T(1 To 9)

  For i = 1 To 9

      c = 1

    Do Until c = 0   '같은 단어를 뽑지 않기 위해 설정한 일종의 flag이다. 

        T(i) = rng.Cells(Int(Rnd * 25 + 1)): c = 0

      For n = 1 To i - 1

         If T(n) = T(i) Then c = 1     '뽑은 단어들 중 같은 단어가 있는지 검사

       Next n

    Loop

  Next i

str = Join(T, ",")      

On Error Resume Next

nc.Add str, str     '뽑은 단어를 nc라는 콜렉션에 추가한다.

Loop


On Error GoTo 0

i = 3

For Each s In nc

Cells(i, "D").Value = s     '콜렉션에 있는 값을 한꺼번에 셀에 넣을 수 없을까 찾아봤는데, 없는 것 같다. 지금처럼 순환문으로 처리하는 것이 최선인듯

i = i + 1

Next s


End Sub



p.s. Randomize에 대한 의문점을 해결했다!

http://m.cafe.daum.net/ilovevb/4YrA/14?q=D_3DXX1nSmrbc0&


"프로그램을 종료한 뒤 다시 열어서 실행"하면 똑같은 값을 보여준다! 실제로 테스트해보니 과연 그렇다.

그래서 Randomize를 해서 SEED값을 바꿔주는 것이다. 

다만 위의 링크에서는 "For 문이나 Rnd 함수를 쓸때마다 써줄필요는 없고 Form_Load 같은 처음 시작시 한번만 넣어주면 프로그램 내내 다른 숫자를 발생시켜 사용할 수 있습니다." 라고 한다.