2011. 10. 8. 02:41

<stdlib.h>

int rand ( void );

void srand ( unsigned int seed );

 

#define RAND_MAX 2147483647 (32bit 리눅스 시스템 기준)

리턴값

rand : 0부터 RAND_MAX 사이의 의사 난수를 생성 반환.

설명

rand()는 0부터 RAND_MAX 사이의 난수를 생성하지만,

문제는 프로그램을 새로 실행할 때 마다 매번 다른 난수를 만들어 내지 않고

계속 같은 난수를 반복합니다.

그래서 srand()를 사용하여 의사 난수를 생성하기 위해서 난수의 생성 초기값인

seed값을 지정합니다. (보통 seed는 srand((unsigned) time(NULL))로 설정)

 

srand()가 호출되기 전에 rand()가 호출되면 디폴트 값은 1이 됩니다.

 

보통 seed는 srand((unsigned) time(NULL))로 지정하지만 time()는 초 단위이기 때문에

1초 이내에 여러 번 실행하게 되면 같은 난수가 중복되기 때문에 getpid()와 함께

사용합니다. getpid()는 같은 프로그램을 실행해도 매번 실행할 때 마다

프로세스 아이디가 계속 증가되기 때문에 매번 다른 값을 반환하게 됩니다.

이런 이유로 time()같이 사용합니다.

 

예 : srand( (unsigned)time(NULL)+(unsigned)getpid() );

 

 

[ rand의 난수 생성범위에 따른 함수 사용 방법: ]

난수 생성범위

프로그램 연산식

설명

1 <= 정수난수 <= 45

rand() % 45+1;

45로 나눈 나머지 값의 범위는 0~44,

이 값에 1을 더하므로 1~5 사이의 난수 생성

0 <= 정수난수 <= 99

rand() % 100;

100으로 나눈 나머지 값의 범위는 0~99이므로

0~99 사이의 난수 생성.

10 <= 정수난수 <= 30

rand() % 21 + 10;

21로 나눈 나머지 값의 범위는 0~20,

이 값에 10을 더해주면 10~30 사이의 난수 생성.

-5 <= 정수난수 <= 5

rand() % 11 - 5;

11로 나눈 나머지 값의 범위는 0~10,

이 값에 5를 감해주면 -5~+5 사이의 난수 생성.

0 <= 실수난수 <= 1

rand()/(double)RAND_MAX

0~RAND_MAX의 사이의 난수를 다시 (double)RAND_MAX로 형변환된 실수로

로 나눔으로써 0~1 사이의 실수 난수를 생성.

 

Example : lotto 번호 생성

'API 및 라이브러리 > C 라이브러리 함수' 카테고리의 다른 글

sleep(3)  (0) 2011.02.12
strdup(3)  (0) 2010.09.14
strstr(3)  (1) 2010.09.11
system(3)  (0) 2009.12.19
getusershell(3)  (0) 2009.12.19
Posted by devanix