random

반응형

프로그래밍을 해 본 사람이라면 한번씩은 들어봤고 생각해 봤을 random.
렌덤이라면 말 그대로 "무작위"이다. 
예전에 퍼즐게임을 만들어 본 적이 있다. 

그때 고민했던 것이 어떻게 하면 중복되지 않는 무작위 숫자를 얻을 수 있을 까 였다.
아마 당시에는 이렇게 한 것 같다.
1. 원하는 범위의 랜덤값(ex : 0~99)을 담을 수 있는 배열을 생성한다.
    0~99의 인덱스를 가지는 100개의 배열 설정.
2. 배열에 플래그를 줘서 랜덤값이 사용되었는지 안되었는지를 체크한다.
    체킹만 하면 되기 때문에 배열의 자료형은 알아서 적당히...
    당시에는 int형으로 한 것 같은데 지금 생각해보면 그냥 bit값만 체크하면 될듯.
    예를들어 int가 4바이트를 보장한다면 32비트를 사용할 수 있으니 100개의 int 배열이 아니라
    4개의 int배열을 사용해서 128개의 비트를 0,1로 조작해서 사용해도 될 것 같다.
3. 랜덤값이 사용 안되어있다면 비트를 1로 설정하고 랜덤값 사용,
   이미 사용했던 중복 랜덤값이라면(이미 비트가 1이라면)다음 비트를 체크한다.
   마지막 비트일 경우 첫비트부터 체크한다.

간단하게 말하자면 사용한 랜덤값인지 아닌지 체크할 수 있도록 하고
사용한 것이면 다른걸 사용하도록 하자!!
정도 이다.
이 방식의 장점은 비트배열을 사용할 경우 원하는 수에 비해 작은 크기의 배열로
가능하다는 것이며 단점으로는 중복된 값일 경우 중복되지 않은 값을 찾기 위해 계속해서
for문을 돌아야 돌아야 한다는 것이다.
만약 남은 값이 33 하나이고 랜덤값이 34가 나왔다면, 알고리즘이 인덱스 -1이 아닌
인덱스 +1로 검색할 경우 모든 인덱스를 검사해야 하는 최악의 상황이 된다는 것이다.

그 이후에 회사에서 중복되지 않는 무작위값을 얻고자 할때 썻던 방식은 아래와 같다.
1. 원하는 범위의 랜덤값(ex : 0~99)을 담을 수 있는 배열을 생성한다.
    0~99의 인덱스를 가지는 100개의 배열 설정.
2. 이제 배열에 직접 값을 넣는다. 0번째 인덱스에는 0을 33번쨰에는 33을 넣어준다.
   즉, 배열을 인덱스값과 같은 값으로 채워준다.
3. 랜덤을 돌려서 값을 얻고 이 값을 인덱스로 배열에 있는 값을 얻는다.
4. 해당 인덱스의 배열값을 배열의 마지막 값(여기서는 99)를 채워넣는다.
5. 다음 랜덤돌릴때는 0~99가 아닌 0~98로 돌린다.

여기서 생각한 방식은 로또처럼 처음부터 100개의 값을 몽땅 채우고
하나씩 빼서 사용하자!!
였다.
이 방식의 장점은 인덱스 찾기 연산이 필요없다는 것이지만 단점으로는
비트 배열을 사용할 수 없어 랜덤범위가 클수록 배열 범위도 커진다는 것이다.

사실 예전에 작업했던 것이고 랜덤을 어마어마하게 많이, 큰 숫자를 사용할 것이 아니라면
어느 방법으로 하든 이슈가 될 만한 일은 없을 거라고 생각했다.

 

'Study > C++' 카테고리의 다른 글

int와 float 연산  (0) 2016.09.29
factory function (팩토리 함수)  (0) 2012.05.12
Hash 함수 모음  (0) 2011.04.22
boost::has_trivial_assign  (0) 2011.04.10
메모리맵 파일  (0) 2011.04.09
TAGS.

Comments