| [ KAIST ] in KIDS 글 쓴 이(By): icetea (icetea) 날 짜 (Date): 2002년 10월 17일 목요일 오후 02시 54분 33초 제 목(Title): 랜덤에 대한 질문 하나... 랜덤에 대해 궁금한 것이 있어서 질문 하나 하겠습니다.. N 개의 랜덤넘버를 잡아서, 이 N 개를 가지고 어떤 연산을 하려고 하는데요... 저런 연산을 여러번 해서, 각각의 실험에 대한 연산결과들의 평균을 구해서 대강 기대값이 어느 정도인가를 알아보려고 합니다. (원래 풀려는 문제는, 포텐셜이 일정치 않은 공간 내부에 N 개의 입자를 입사 시킬 경우에, 입자들 간의 평균거리가 어떻게 되는가를 알아보는 것이구요.. 포텐셜이 대단히 복잡한 데다가, 주어진 공간의 영역별로 따로 정의가 되어 있어서 해석적으로 풀기는 어려울 거 같습니다.. 포텐셜로부터 확률분포를 얻어낸 다음에, 몬테카를로 시뮬레이션을 해서 얻어진 분포를 따르는 set 를 만들려고 하고요... ) 처음에 아래와 같은 코드를 이용했는데요... for ( p = 1; p < 100000 ; p++) { srand((unsigned)time(NULL)); for ( k = 1 ; k < N + 1 ; k++) { rand_pos = (double)rand(); position[k]=(rand_pos/(double)RAND_MAX)*upper_bound; } } p 를 증가시켜가면서 그때그때 position[k] 들에 대한 정보를 처리하는 부분은 따로 있구요.. 문제는.. 이 코드에서 나온 결과물이, 매번 코드를 새로 실행할 때마다 좀 큰 폭 으로 변한다는 건데요... 제 생각에는, 100000 번쯤 실험을 하면 변화가 있더라도 그 폭이 아주 작아야 할거 같거든요... 그래서, 두번째로 아래 코드로 실행을 해봤는데.. srand((unsigned)time(NULL)); for ( p = 1; p < 100000 ; p++) { for ( k = 1 ; k < N + 1 ; k++) { rand_pos = (double)rand(); position[k]=(rand_pos/(double)RAND_MAX)*upper_bound; } } 보시면 알겠지만 , srand 부분을 for 루프 밖으로 빼버렸습니다.. 그니까 처음에 한번만 선언을 해주고 100000번 실험을 하는 거죠.. 근데 이렇게 하니까.. 돌릴 때마다 차이가 별로 크지 않고 대충 고정된 값으로 나오더군요.. 이게 꼭 실험이 제대로 되었다는 걸 말해주지는 않겠지만은.. 왜 이런 일이 생기는 건가요? 제 생각에는.. 결과는 제쳐두고, 첫번째 코드가 실험의 의미상으로 옳은 것 같습니다만.. 프로그래밍 초짜이니 쉽게 설명해주세요.. ^^ vc++ 에서 작업했습니다.. |