본문 바로가기
C++

[C++]랜덤함수 rand_s() 함수

by Junk_Seo 2018. 3. 11.
반응형

rand()와 rand_s() 함수

랜덤 함수를 사용할 일이 있어서 rand() 함수를 찾던 중 rand_s()라는 함수가 있어서 찾아보았습니다. 

 

먼저 랜덤 함수에 대해서 알아보겠습니다.

rand() 함수

rand() 함수는 <stdlib.h> header에 포함되어 있는 함수이기 때문에 

#include <stdlib.h>를 추가해서 사용합니다.

 

구문

int rand( void ); 

 

반환 값  

난수를 반환하여 반환되는 오류는 없습니다.

 

설명

rand() 함수는 0부터 RAND_MAX(32767) 범위의 의사 난수 정수를 반환합니다.

 

난수 범위 지정

[0 ~9] int nData = 0;
nData = (int)(((double)rand() / (RAND_MAX + 1) * 10));

[1 ~10] 
int nData = 0 nData = (int)(((double)rand() / (RAND_MAX + 1) * 10) + 1);

 

난수의 범위는 위 코드와 같이 지정하여 사용하는데, 

(int)(((double) rand() / (RAND_MAX + 1) * [난수 범위]) + [난수 최솟값]);

난수 최솟값은 난수의 시작 값이고,

난수 범위는 난수 최솟값부터 몇 개의 범위인지를 말합니다.

즉, 난수 범위가 10이고 난수 최솟값이 1이면 1~10 사이의 난수를 난수 범위가 10이고 난수 최솟값이 2이면 2~11 사이의 난수를 반환합니다.

 

문제점

rand() 함수만 사용하면 프로그램을 다시 시작해도 같은 값의 난수를 생성합니다. 이유는 시드(Seed) 값 때문입니다. rand() 함수의 난수 생성은 시드값에 의해 생성되는데, 이 시드값을 설정해주지 않으면 계속해서 같은 시드값으로 난수를 생성하므로 프로그램을 다시 시작해도 같은 난수를 생성합니다. 

따라서 rand() 함수를 사용하기 전에 srand() 함수를 사용하여 시드값을 설정해주어야 합니다. 

프로그램을 시작할 때마다 시드 값을 랜덤으로 생성하기 위해 

" srand((unsigned int) time(NULL)); "를 rand()를 사용하기 전에 추가해주어야 합니다. 

이렇게 되면 프로그램을 시작할 때마다 시드값을 생성합니다. 

 

****

time() 함수는 <time.h> header에 있으므로 이 header를 추가해야 합니다.

rand_s() 함수

rand_s() 함수의 경우 

#define _CRT_RAND_S   #include <stdlib.h>  

위처럼 header 뿐 아니라 #define _CRT_RAND_S도 추가해야만 사용할 수 있습니다.

 

구문

errno_t rand_s(unsigned int* randomValue);

 

반환값

성공하면 0 그렇지 않으면 오류 코드를 반환합니다. 

난수는 out parameter인 randomValue로 값을 받아옵니다.

 

설명

rand_s() 함수는 0부터 UNIT_MAX(0xffffffff) 사이의 난수를 생성합니다. 

srand() 함수를 사용하여 시드값을 설정하지 않아도 됩니다.

rand() 함수를 보완한 함수입니다.

 

난수 범위 지정

[0 ~9] 
unsigned int uNumber = 0U;
int nNumber = 0;
rand_s(&uNumber);
nNumber = (int)((unsigned int)((double)uNumber / ((double)UINT_MAX + 1.0) * 10) + 0);

[1 ~10] 
unsigned int uNumber = 0U;
int nNumber = 0;
rand_s(&uNumber);
nNumber = (int)((unsigned int)((double)uNumber / ((double)UINT_MAX + 1.0) * 10) + 1);

난수 범위 지정의 경우 rand() 함수와 동일합니다.

(int)((unsigned int)((double)uNumber / ((double)UINT_MAX + 1.0) * [난수 범위]) + [난수 최솟값]);]

난수 최솟값은 난수의 시작 값이고,

난수 범위는 난수 최솟값부터 몇 개의 범위인지를 말합니다.

즉, 난수 범위가 10이고 난수 최솟값이 1이면 1~10 사이의 난수를 난수 범위가 10이고 난수 최솟값이 2이면 2~11 사이의 난수를 반환합니다.

 

rand_s() 출처(msdn) : https://msdn.microsoft.com/ko-kr/library/sxtz2fa8.aspx

rand()   출처(msdn) : https://msdn.microsoft.com/ko-kr/library/398ax69y.aspx

반응형