:: 게시판
:: 이전 게시판
|
이전 질문 게시판은 새 글 쓰기를 막았습니다. [질문 게시판]을 이용바랍니다.
통합규정 1.3 이용안내 인용"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
08/06/21 01:47
구조체 배열 초기화는 그냥 for 문 돌면서 해주시면 되구요..
랜드 함수 문제는 디버거로 보면서 문제점 아시는게 장기적으로 봤을 때 훨씬 좋을 것 같네요.. (디버거 사용법 한 30분이면 충분히 익히니.)
08/06/21 02:06
한줄씩 죽 훑어 봤는데요
버그란 녀석은 역시 의외의 장소에서 나오나 봅니다. temp_gene_num[i][j] 를 temp_gene_num[a][j] 로 바꾸어야 겠네요 한번 테스트 해보니 대충 맞게 돌아가는군요 이런 경우가 많으니 index가 여러개가 되면 꼭 하나씩 확인하세요( 저같은 경우 3일을 헤맨 경우가 ㅠ.ㅠ 디버거는 꼭 필요합니다!!)
08/06/21 02:11
아참 추가로 중복체크하는 부분에 문제가 조금 보입니다.
하나의 중복이 나오면 새로 난수를 생성하고(index = n), 그다음 중복체크는 continue에 의해 index = n+1부터 시작되는 걸로 보입니다. 간단한 테스트 방법으론 #define MAX_SIZE 10 를 하면 눈에 바로 보입니다. 조금더 생각해 보시구요, 힘내세요~ 전 이만 텀플하러 슝~
08/06/21 03:09
음...continue에 그런 문제가 있었군요.
근데 일단 [a][j]로 고치고 continue부분을 고쳐서 새로 생성된 부분을 기존의 중복되는 temp_gene_num[j]과 매치시켜서 중복이 안나올때까지 while루프로 계속 중복 안나오게 만드는 부분을 추가하니까 중복이 더 심해지더군요-_-);; for(j=0; j<=i; j++) if(temp_gene_num[a][j] == 0) temp_gene_num[a][j] = gene_num; else if(temp_gene_num[a][j] == gene_num) { while(gene_num != temp_gene_num[a][j]){ gene_num = rand()%100+1; if(gene_num != temp_gene_num[a][j]) temp_gene_num[a][j] = gene_num; } } ...가면 갈수록 첩첩산중입니다. 가만 놔두니까 오히려 중복률이 훨씬 적은 편이지만...그걸로 안주할 생각은 없으니 말입니다.
08/06/21 05:07
음.... 시작하는 프로그래머에게 좋은 화두가 되는 문제내요.
예전부터 있던 문제인데... 0~99 까지 있는 배열을 어떻게 하면 잘 섞을까 하는 문제의 변형 같습니다. 수 많은 난상 토론이 이루어진적이 있지만... 누구도 이것이 옵티말 이다 한 답이 없던 것으로 알고 있습니다. 저 역시 나름의 답이 있지만... 그것이 옵티말 인지는 모르겠습니다. 아무튼 머리잘써서 생각해 보세요. 곰씹으면 꼽씹을수록 단맛이 나는 문젱 입니다.
08/06/21 10:26
흠흠.... 그럴 경우에는 goto문을 써서 하면 괜찮습니다.
아니면 이런 방식으로 접근해도 괜찮습니다. 잠깐 알고리즘만 써드릴테니까 코드로 짜 보세요. gene_num = rand()%100 + 1; while(gene_num == temp_gene_num) gene_num = (gene_num + 1) % 100;
만약 같다면 다시 랜덤을 생성하는 것보다는 그 값에 1을 계속 더하면서 가장 가까운 빈자리에 집어넣으면 확실합니다. 이렇게 하는 것이 time complexity도 더 짧기 때문에 좋아요.
08/06/21 13:41
↑위에 처럼 하면 time complexity 는 짧은데 이상적인 난수라 보기는 어려울 수 있을 것 같네요..
(혹시 언뜻 생각하기에는 아닌데 계산해보면 같게 나오는 경우인가요?)
08/06/21 15:40
random seed값을 2번 가져올순 없는 모양입니다. 그렇게 하니까 똑같은 연산을 반복해서 여전히 같은값을 출력하는건 같았습니다.
곱씹어 보라했는데 저 알고리즘을 가지고 한 10번 고쳤다면 이 이상 곱씹어 볼 방법이 있을까 싶습니다. 재생성이 필수인데 재생성의 의미가 없어지는 2번째 gene_num = rand()%100+1; 입니다.
|