C, C++ 1~N 연속된 수로 이루어진 랜덤 배열

1~N, N~M으로 이루어진 배열 또는 이미 지정된 값들로 구성된 배열을 랜덤하게 생성하는 방법에 대해 누군가 질문한 적이 있다.

 

만일 테스트 용도로 그 값들을 랜덤하게 생성해야 한다면, 시간에 따른 RAND함수로 도출하는 것은 절대적으로 리소스 낭비가 크다.

 

예를 들어, 1~10까지의 수로 이루어진 배열 [1,2,3,4,5,6,7,8,9,10]을 랜덤하게 뽑으려면 확률상 몇번의 RAND()를 불러야 할까?

 

따라서 랜덤으로 배열을 만드는 것 보다. 이미 만들어진 배열을 랜덤으로  섞는 것이 더 유리하다.

 

C++이나 Java와 같은 언어에서는 이미 이런 기능을 함수로 만들어 제공한다.

함수의 이름은 Shuffle이다.

 

만약 셔플 함수를 제공하지 않는 다면 아래와 같이섞을 수 있다.

void shuffle(int* arr, int size){ 
   srand(time(null)); 
   for(int i = size-1; i > 0; i--){ 
         int j = rand() % (i+1); 
         swap(arr[i], arr[j]);
   } 
} 
int arr[30]; 
for(int i = 0; i < 30; i++)  
arr[i]= i+1;  
shuffle(arr, 30);

 

jcdgods

누구게?

You may also like...

2 Responses

  1. thebarbershop 댓글:

    Shuffle을 suffle로 오타를 내신 것 같네요. C++의 std::shuffle이나, 자바의 Collections.shuffle이나, 이런 기능에 대해 보편적으로 쓰이는 이름이나, 다 shuffle로 쓰는게 일반적이라고 생각합니다.

답글 남기기

Translate »