#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define ARR_SIZE 1000
void init_insert_rand(int arr[],int index)
{
srand(time(NULL));
int rand_Val;
int flag=0;
for(int i=0; i < index; i++)
{
while(true)
{
rand_Val=rand()%ARR_SIZE;
for(int j=i; j>=0 ; j--)
{
if(arr[j]==rand_Val)
{
flag++;
}
}
if(flag==0)
{
flag=0;
break;
}
else
flag=0;
}
arr[i]=rand_Val;
}
}
//int ARR2[ARR_SIZE];
void main()
{
int ARR[ARR_SIZE];
init_insert_rand(ARR,ARR_SIZE);
// init_insert_rand(ARR2,ARR_SIZE);
}
주석문 풀고 돌리면 init_insert_rand() 함수에서 무한 루프를 돌아버린던데 이거 왜 그런가요?
혹시 지금 이거 중복 안되는 랜덤값들로 배열 채워넣으려고 하는거야?
초기값 전역 => 0으로 초기화, 지역 =>?(쓰레기값)
ㅁㅁㅁ 맞습니다. 중복안되게 넣는 것인데 (ㅅㄳㄳㄳㄳㄳ : 어짜피 배열 끝까지 값을 넣으므로 초기화 문제는 없을 듯합니다.) 지금 문제는 while 문의 무한 루프인데 그부분을 중첩되더라도 랜덤값을 넣게 만들면 전역이던 지역이던 상관이 없습니다.(문제 없이 동작된다는 말입니다) ....문제는 위와 같은 함수를 작성하고 전역으로 선언된 배열을 인자로 넘겨주어 실행하게 되면은 무한루프가 돌게 됩니다....(지역으로 주어진 경우에는 괜찮습니다.) 현재 왜 \'전역으로 선언된 배열을 무한 루프(탈출조건이 주어짐)\'에 넣으면 안되는지 모르고 있습니다.
그냥 디버그 걸어봐..
난 방법 자체를 바꾸라고 권하고싶어.
랜덤숫자 하나를 만들어서 썼는지 안썼는지 확인 하고 다시 랜덤숫자를 만들고. 이런 방식은 뒤로 갈수록 숫자를 만들어야 하는 횟수가 늘어나고 배열이 커지면 실행시간이 눈에 띄게 길어지거든. 그냥 배열에 1 2 3 4 5 ,... 1000 을 순서대로 채워넣은 후에 배열 크기의 2배 횟수만큼루프를 돌면서 난수2개씩 발생시켜 그 2곳의 값을 서로 바꿔주는거지. 애초에 숫자를 만들때 한개씩 만들었으니 중복체크는 필요가 없는거야. 실행시간 자체도 랜덤이 아니라 고정이 되는거고.
for(int j=i; j>=0 ; j--) 이게 문제인듯. 아마 i=ARRAYSIZE-1일때 넣을 수 있는게 없을거임.
그리고 ㅁㅁㅁ훃아의 방법은 과연 모든 경우의 수가 같은 확률로 나타나는가에 대한 검증이 필요할듯?
카사노바 // 확인 해봤는데 0 ~ 999사이의 난수 100만개를 뽑을때 각 900 ~ 1100개씩 분포해. 중요한건 자기가 원하는만큼 충분히 섞이기 위한 루프수를 산출 해 내는 기준이지
http://codepad.org/eZ0KPQ3f
좋은 답변 감사합니다. 문제가 해결되었네요