srand()질문
536
작성한 질문수 57
다른분이 먼저하신 질문에서 추가로 궁금한게있는데
main함수안에서 srand(time(0))으로 초기화시키면
딱 time(0)값이 srand()안으로 들어가서 1번 초기화가 된 상태에서
그걸 rand()로 while 문 안에서 뽑아쓰는거고
while문 안에 srand(time(0))이 있으면
실행될 때 1번 초기화 시켜주고 다시 초기화 시켜줄 때
time()이게 컴퓨터내부에서 계속 숫자가 올라가는데
시드값이 계속 바뀌는게 아닌가요?
오히려 srand()를 while밖에서 초기화 시키는게 초기화가 1번만되서 랜덤성이 더 없다고 생각되는데
이 의문점이 해소가 안됩니다.
답변 1
3
시드값은 초기에 한번만 랜덤하게 설정해주면,
그 다음부터는 매 번 바꿀 필요는 없습니다.
그럭저럭 랜덤하게 보이는 수학 공식을 이용해
계속 숫자를 추출하기 때문이죠.
또한 완전히 동일한 시드값을 넣는다면,
그 다음에 실행하는 일련의 rand()의 결과는 항상 같습니다.
가령 srand(0)으로 초기화를 했으면,
그 다음 rand() % 3를 여러번 실행한 결과는
2 0 1 1 2 1 1 2 1 0 0 2 .. 순서로 무조건 나오게 됩니다.
때문에 시드값 초기화(srand)를 while 문 안에서 매 번 하게 되면
이전 시드값과 겹치지 않는지 조심해야 합니다.
while () 안에서 srand(0)으로 매 번 초기화를 해준다면
rand() % 3 는 항상 일관적으로 첫번째 결과인 2만 뱉게 될겁니다.
이전 질문자 분의 질문에서 srand()를 while () 안에다 하셨다길래,
while 내부에서 srand(0)와 같은 고정값으로 넣은 것으로 착각해서 살짝 잘못 답변을 드렸네요.
다시 읽어보니 srand(time(0))을 while 내부에 넣었다는 것으로 이해가 되는데,
그럴 때도 문제가 일어나는 이유는 time() 함수의 리턴값이
1970/01/01 00:00 이후 경과된 초(sec)를 반환하기 때문입니다.
즉, 매 초마다 time(0)이 바뀌기 때문에
동일한 1초 내에서는 time(0)의 반환값이 항상 같고,
결과적으로 srand()에다가 동일한 시드값을 넣어주고 있기 때문에
랜덤이 아닌 (해당 시드로 설정했을 때의 첫번째 rand 값)만
주구장창 뱉어주고 있는 것입니다.
visualstudio에서 파일분할관리실습시 설정 문의를 드립니다.
0
541
1
정렬함수 좀 더 확실하게 이해 할 방법이 있을까요?
0
442
1
strcpy() 구현 관련 질문
0
513
1
빌드(망치)를 누르니 이런 오류가 떴습니다. 어떻게 해야 하나요?
0
452
1
클래스 타입의 포인터 질문합니다
0
546
1
입력값을 enum 값에 넣어주는거 이제 막혔나요?
0
497
1
템플릿 특수화 관련 질문
0
385
1
포인터 관련 질문합니다!
0
263
1
Unable to start assembler. Check your settings.
0
830
2
cpu선택
0
539
1
포인터 질문이 있습니다
0
324
1
20:35 에서 구조체 크기에 대한 질문입니다!
0
584
1
iterator 삭제관련
0
406
1
함수 호출을 디스어셈블러로 분석하다가 궁금점이 생겼습니다!
0
310
1
15 분 45초 대 질문
0
308
0
스택 프레임 질문합니다!
2
306
1
오른값 참조 in 게임
0
384
0
동적할당 질문이 있습니다
0
450
1
안녕하세요 메모리에 대해 질문드립니다.
0
304
1
함수객체 의 매개변수
0
359
1
복사생성자
0
434
1
main이나 endl 부분이 주황색으로 표시된건 어떻게 하나요
0
420
1
포인터 실습 강의를 보고 궁금한게 있습니다.
0
354
1
스택 오버플로우
2
790
1





