평범한 이야기들

난 수 - 겹치지 않은 수 본문

평범한 개발 이야기/PHP

난 수 - 겹치지 않은 수

songsariya 2008. 7. 17. 03:24
728x90
  난 수 -

[명사]특정한 배열 순서나 규칙을 가지지 않는, 연속적인 임의의 수.


프로그래밍을 할때에도 난수는 접하는 경우가 많이 있다.
대부분 프로그래밍 언어에서는 함수로 정해져 있으며 그 사용량도 어느정도는 될듯 하다.

하지만 난수는 말 그대로 규칙을 가지지 않고 생성되기 때문에 (물론 규칙을 가지는 난수함수도 존재)
그리고 기본적으로 제공되는 함수는 랜덤하게 찍히지만. 겹치는 숫자가 존재한다.
또한 사용자가 원하는 난수가 생성되게 하기 위해서 여러가지 방법을 쓴다.

요번에 작성할 것은 일정한 범위에서 겹치지 않는 수를 랜덤하게 찍어내는 것이다.
전에 소개한 겹치지 않는 5자리의 수와는 또 다른 것이다. (php)

ASP 언어로 카테고리를 잡은거에 대해서는 ASP는 비주얼베이직 함수를 쓰며 엑셀 역시 비슷하기 떄문이다
(내가 접한 것이 엑셀 문법에서 접하였기 때문이다.-)

먼저 생성하고 싶은 숫자의 갯수에 맞게 2차원 배열을 선언한다.

ex) Int arrnum[생성할 랜덤 숫자의갯수][2];

- 여기서 2차원으로 배열하는 것은 나중에 알게 될 것이다.

그후 2번째 행. 즉 arrnum[0][1] ~  arrnum[n][1] 까지
순차적으로 1 ~ n까지의 숫자를 넣는다.

그런 후 1번째 행에 기본적으로 제공되는 랜덤함수를 써어 자료값을 넣는다.

ex)
-----------------------------------------------------
|  23  |  10  |  99  |  48  | 2830 | 233 | 19238 | 11 |  900 |
-----------------------------------------------------
|   1   |   2  |   3   |  4   |   5    |  6  |     7   |   8  |  9    |
-----------------------------------------------------

1번째 행을 가지고 sort를 시킨다.
(1번째 행은 무작위 랜덤의 수가 들어가 있기 때문에 sort를 시키면 내림차수 또는 올림차수로 정렬이된다)
Sort를 시킬때에는 2번째 행에 있는 자료값도 같이 다녀야 한다. 즉 같은 열은 sort될때 같이 다닌다.

Sort를 마치면 1번째 행은 정렬이되어있지만 2번째행은 1번째행을 따라다녔기때문에 무작위로 배열되어있다.
그럼 2번째 행을 가지고 일정 범위의 랜덤한 배열을 만들 수 있다.

ex)
-----------------------------------------------------
|  10 |  11  |  23  |  48  | 99 | 233 | 900 | 2830 |  19238  |
-----------------------------------------------------
|  2  |   8   |   1   |  4   |  3 |   6  |   9  |   5    |     7     |
-----------------------------------------------------


간단한 예로 버블정렬로 저 알고리즘을 쓴다면
For i = 1 To lngCount
        For j = i + 1 To lngCount
            If varMyVar2(1, i) > varMyVar2(1, j) Then
                varTemp1 = varMyVar2(1, j)
                varTemp2 = varMyVar2(2, j)
                varMyVar2(1, j) = varMyVar2(1, i)
                varMyVar2(2, j) = varMyVar2(2, i)
                varMyVar2(1, i) = varTemp1
                varMyVar2(2, i) = varTemp2
            End If
        Next j
    Next i

'열이 같이 다녀야 함으로 1번째 행을 따라 간다.

처음 봤을때에는 어떻게 작동되는지 생각을 하던 경우 매우 좋은 방법중 하나라 생각이 들었다-
역시 다른 사람들의 것들도 자주 봐야지 실력 향상에 도움이 될것 같다.
728x90
Comments