제목에서와 같이 임의의 시퀀스를 사용하고 싶다고 하자.
시퀀스는 가지는 원소가 전부 서로 다르며, 원소에 순서가 부여 되어있는 것이다.
이것을 위해 만약 rand()를 사용한다면 주의해야한다.
간단한 알고리즘은 일반적으로
rand()를 원소 개수로 나눈 나머지를 사용하게 된다.
rand()자체가, 이전 호출에서 반환된 값과 같게 나올 수 있으니까,
단순히 이전에 뽑은 값들과 비교해서 같은 경우 rand()를 다시 호출하도록 하는 것이다.
이 알고리즘의 문제는 원소개수가 충분히 컸을 때,가장 마지막으로 뽑는 원소는
rand()를 충분히 많이 호출해야지 선택할 수 있다는 것이다. 즉, 시간이 오래 걸린다.
일단은 나도 아는 게 없어서, 다른 대안책 두 가지를 말해본다면,,
1.
선택하지 않은 것들을 일렬로 나열하고 인덱스를 부여해서, rand()함수로 그 범위의 인덱스들 안의 난수를
얻게 하는 것이다. 간단히 말하면 rand()%(선택하지 않은 것들의 개수)
2.
특정 순서로 나열된 전체 원소를 다시 임의로 섞는 방식으로 구현한다.
원소가 하나의 배열에 있다고 보면,
섞는다는 것은. 하나를 선택해서 정해진 한 쪽 끝에 놓는 과정을 반복하되,선택한 것은 이미 또 선택하면 안되니까
선택되어 있는 것들이 모여있는 인덱스들은 선택하지 않도록 하는 것이다.
요점은 rand()%( ... )에서 연속된 범위의 인덱스를 뽑는 대신,인덱스의 범위는 선택하지 않은 것들의 인덱스 범위고,
연속적인 인덱스를 부여할 수 있도록 어떻게든 만드는 것이다.
'자료구조 및 알고리즘' 카테고리의 다른 글
(STL) set , map 등에서는 const_iterator만 써야 한다. (0) | 2009.11.23 |
---|---|
(C++)Iterator (0) | 2009.10.26 |
GA design feedback (0) | 2009.10.06 |
UVA 로봇 심사위원에게 Accepted 사인 받기 위한 점검. (0) | 2009.07.10 |
(STL)map과 hash_map의 차이 (0) | 2009.03.29 |