Turbo-C
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
터보-C 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
Lua 게시판
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C/C++ Q/A
[2166] 음... 저도 확실한 해결법은 모르겠네요. 코멘트를 하자면...
김백일.cedar [cedar] 1262 읽음    2003-03-26 11:48
로터스 님이 쓰신 글 :
: 한 프로그램에서 두 배열에 각기 다른 난수를 넣으려고 합니다.
:
: srand( (unsigned)time( NULL ) );
:
: 이런식으로 두개를 작성하여 각각 배열마다 함수를 호출하였는데요
: 두 배열에서 같은 난수가 나옵니다.
: 아무래도, 거의 같은 시간에 호출이 이루어져, 똑같은 난수가 나오는 듯 싶은데요..
:
: 예를 들면..
:
: void rand1()
: {
:    srand( (unsigned)time( NULL ) );
:    ...
:    printf(a[i]);
: }
:
: void rand2()
: {
:    srand( (unsigned)time( NULL ) );
:    ...
:    printf(b[i]);
: }
:
: void main(void)
: {
:     rand1();
:     rand2();
: }
:
: 이렇게 하면 같은 값이 나오게 되네요..
:
: 어떻게 하면, 두 배열에 각기 다른 난수가 나오게 할 수 있을까요?
: 갈길 먼 초보에게 도움 부탁드립니다.

time은 1초 단위로 시간을 측정하므로 당연히 같은 값이 나옵니다.
srand의 seed 값을 다르게 하면 rand1과 rand2의 값도 달라지지만,
문제는 시스템 시계는 하나뿐이므로 rand1이 rand2를 결정해버리는 문제점이 있죠.

이식성을 포기한다면 방법이 있을 겁니다.
지금 생각난 방법은 두 가지인데요.
첫째, 윈도나 유닉스 API가 제공하는 타이머 자체의 오차를 이용해서 두 번째 seed 값을 결정하는 방법이 있겠고요,
둘째, 리눅스나 솔라리스의 경우는 커널 자체에서 /dev/random이라는 난수 발생기를 제공합니다.
(구 버전은 없습니다.) 이것은 시스템 시계 뿐만 아니라 다른 장치 드라이버도 같이 사용하기 때문에 좀 더 확실한 해결법입니다.
윈도에는 /dev/random이 없지만, 이 아이디어를 응용해서 시스템 시계 대신 다른 소스를 사용하는 방법을 찾아보시면 될겁니다.
세째, 아예 ANSI C 라이브러리의 랜덤 함수대신 다른 랜덤 함수 라이브러리를 쓰시는 겁니다.
둘째 방법과도 비슷하지요.
이건 이 자체가 하나의 연구 분야일 정도로 많은 자료를 찾을 수 있습니다.
그 중에 하나를 추천하자면, Boost 라이브러리에 있는 랜덤 함수 라이브러리입니다.
http://boost.org/libs/random/index.html

여기까지 밖에는 답변을 못해드리겠네요. -_-;; 이상의 정보로 잘 검색해보시길...

+ -

관련 글 리스트
3901         Re:Re:srand에 관한 질문입니다. 로터스 1743 2003/03/26
2166     음... 저도 확실한 해결법은 모르겠네요. 코멘트를 하자면... 김백일.cedar 1262 2003/03/26
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.