VBA에서


int(Rnd * 5) 하면  0부터 4까지의 랜덤 숫자가 나온다.


1부터 5까지로 하려면

Rnd*4+1로 해서 0부터 4까지 나온 수에 1을 더하면 된다.


그런데 랜덤 숫자는 바로 전에 나온 숫자와 중복된 숫자가 나올 수도 있다.

이를 방지하는 방법을 생각해보자.



그저 단순히 이전 랜덤값을 저장했다가 비교할 수도 있지만

중복된 수를 원천적으로 차단할 수는 없다.


그래서 배열을 이용해본다.

5개의 배열에 1부터 5까지를 넣어 두고

랜덤으로 배열을 섞어주는 것이다.

어떤 값을 가진 배열들을 서로 섞는 것이라 중복된 수가 나올 수가 없다. 



1부터 5까지의 수중에서 랜덤으로 추출한다고 가정하고

소스 일부분을 보자




Private Num() As Integer

Private CurIndex As Integer

Const DEFAULT = 1


Sub GetRandom()

    Dim Min As Integer, Max As Integer

    Dim i As Integer

    Dim r As Integer, temp As Integer

    

    Randomize

    Min = 1

    Max = 5

    ReDim Num(Min To Max)

    

    'initialize the Num array

    'Num(1)=1, Num(2)=2, Num(3)=3 ...

    For i = Min To Max

        Num(i) = i

    Next

    

    ' shuffle

    ' get random index and exchange each other

    For i = Min To Max

        r = Rnd * (Max - Min) + Min  'Rnd * 4 +1

        'swap index i's value and r's value

        temp = Num(i)

        Num(i) = Num(r)

        Num(r) = temp

    Next


 ...생략...


소스를 보면


Num(1) 부터 Num(5) 까지에 1부터 5까지의 숫자를 일단 담아 두고


최저값부터 최대값까지 돌면서 랜덤한 위치의 배열값과 현재위치의 배열값을 서로 바꿔준다.


끝까지 루프를 돌면 배열값은 여기저기 섞이게 된다.




예제 슬라이드쇼를 만들어 보았다.


Random.pptm


첨부한 PPT파일은 아래 화면과 같이 1~5사이의 랜덤값을 구해서


5번에 걸쳐 랜덤한 슬라이드로 이동하는 예제이다.



먼저 1번 버튼을 눌러 배열을 섞습니다.

누를 때마다 섞어진 배열을 보여줍니다.


그리고 현재 인덱스는 1이며 그 1번째 랜덤값은  1이므로

2번 버튼을 누르면 1번 슬라이드로 넘어갑니다.



1번 슬라이드에 도착했습니다.

핵심 소스를 보여주고  있습니다.


다시 리턴 버튼으로 마지막 슬라이드로 돌아갑니다.



다시 2번 버튼을 눌러 다음 랜덤 슬라이드로 넘어갑니다.

2번째 랜덤값인 4번 슬라이드로 이동합니다.



다시 리턴을 눌러 돌아가고 다음 랜덤 슬라이드로 넘어갑니다.



지금까지 중복되지 않는 랜덤값을 구해보았습니다.


PPT를 제작할 때 임의의 랜덤한 위치의 슬라이드로 이동하고 싶을 때 참조하면 되겠습니다.

여기서는 배열을 섞었는데

아예 슬라이드 자체 순서를 섞을 수도 있습니다.

하지만 섞인 상태에서 저장하면 보기가 좋지 않은 단점이 있습니다.



수정: 2018.5.17

요청에 의해 추가로 44개 슬라이드인 경우로 바꿔봤습니다.



Random44.pptm


이번에는 처음으로 돌아가지 않고 44개중의 하나로 바로 건너뛰는 경우


Random44Direct.pptm