C++. rand()를 함수 내에서 활용하려고 할때 같은 값이 반복되네요.
글쓴이: frhyme / 작성시간: 수, 2015/04/08 - 12:23오후
너무 쉬운 질문인것 같아 죄송스럽습니다만..
간단하게,
메인함수내에서
for(;;) { srand(time(NULL)); a=rand(); }
위 코드가 있을 경우에는 a의 값이 계속 다른 값이 출력되는데,
따로 함수를 정의해서, 함수명이 function_1이라고 하면
void function_1() { srand(time(NULL)) a=rand(); } for(;;) { function_1(); }
위와 같이 처리할 경우에는 a에 같은 값이 연속적으로 들어가 있네요. 이게 왜 그런걸까요.
너무 간단한 질문을 여쭤봐서, 죄송하네요ㅠ
Forums:
이건 검색 해보심 좀 나와요
아마 랜덤이라도 같은 패턴 값이 나오게 되어 있어서 부를때 마다 같은 값이 나온다는 글들을 본적 있습니다.
검색어 치실 필요도 없고 "랜덤함수" 치면 참고하실게 많지 싶어요.
저도 요즘 그럴싸한 랜덤 함수를 찾고 있습니다
첫 번째 경우에도 1초 단위로 같은 값이
첫 번째 경우에도 1초 단위로 같은 값이 나올텐데요...
어쨌든 srand()는 난수생성기에 seeding하는 함수인데, 여기에 같은 int 값을 넣으면 같은 난수들이 순서대로 발생합니다. time()은 초 단위로 같은 값을 주니까 질문한 코드에서 srand()에는 초 단위로 같은 값이 들어갑니다. 그러니까 0초일 때나 0.5초일 때나 같은 난수가 발생하고, 1초가 지나면 time()이 넘겨주는 값이 1 증가하니까 다른 값이 seeding되면서 다른 난수가 발생합니다.
기본적으로 srand()는 프로그램 내에서 한 번만 실행하면 되니까 첫 번째 예의 경우에는 for 문 전에 한번만 넣고 두 번째 예의 경우에는 main 함수에서 한 번만 실행하면 됩니다.
feel the gravity
...
위에 Palsuet 님도 써주셨지만 srand는 프로그램 전체에서 랜덤 함수를 쓰기 전에 *단 한 번* 랜덤 함수를 초기화하기 위해 부르는 함수고 그 다음에는 계속 rand만 부르는 게 올바른 사용법입니다.
srand를 여러 번 부르면 더 랜덤이 되는 게 아니라 애써서 남들이 열심히 연구해 만들어 놓은 난수 알고리즘의 기본 가정을 깨먹는 상황이 되어서 랜덤함이 더 나빠집니다.
댓글 달기