정수 배열을 주면 랜덤으로 섞는 함수를 만들고 싶은데..
글쓴이: namoooo / 작성시간: 일, 2003/11/09 - 1:55오후
안녕하세요. 취미로 하는 허접코더 나무라고 합니다.
다름이 아니라 일정크기의 정수 배열을 주면 랜덤으로 두 인덱스를 잡아 두 위치의 값을 바꾸는 함수를 만들었습니다.
저 함수를 한 10번 정도 반복 실행하면 배열안의 값이 섞일거라 생각했는데요.
실재로 해보니 매번 sake_list를 호출할때 마다 똑같은 두 위치가 잡히더라구요. 예를들면 10번다 계속 array[2]와 array[8]을 바꾸는...
저는 매번 함수를 호출할때마다 함수 안의 random함수가 다른값을 만들어내리라 기대했는데 그렇게는 안되는거 같구...
어떻게 하면 원래 의도하는대로 할수 있을ㄲ요?
//정수 배열을 넘겨주면 정수배열을 무작위로 섞는 함수
void shake_list(int array[], int size)
{
int m,p,temp;
time_t t;
srand((unsigned) time(&t));
m=random(size);
p=random(size);
temp=array[m];
array[m]=array[p];
array[p]=temp;
}
...
...
...
for(i=0;i<10;i++) {
shake_list(array,25);
}
Forums:


srand함수가 안에 있군요 : )
srand함수는 랜덤함수를 사용할 때 처음 seed값을 지정해주기 위한
것입니다. 만약 namoooo님이 만드신 함수를 for문으로 돌리게 되면
srand함수는 time함수를 통해서 seed를 결정하게 되는데 시간차이가
없으므로 거의 변화가 없게되죠.^^;;;
따라서 srand는 프로그램의 처음에 한번 써주시면 될 것 같습니다.
galadriel in the tower of elves
요런건 어떨까요?
void swap(int * x, int * y) { int temp; temp = *x; *x = *y; *y = temp; } /* * shake_list: 배열을 섞는 함수. * arguments: * int * p: 섞고싶은 정수 배열의 시작주소. * int n: 배열의 원소 갯수 * return: * void * 랜덤으로 한개씩 뽑아 맨 뒤에 차례로 놓으면서 섞음. */ void shake_list(int * p, int n) { int ran; // 랜덤으로 뽑은 인덱스 srand(time(NULL)); while (n>1) { ran = rand() % n; swap(&p[ran], &p[--n]); } }댓글 달기