Wednesday, November 29, 2006
C언어] 0.0 ~ 1.0 범위 실수 난수; 실수형 랜덤 생성; Random Double
다른 언어들의 랜덤 함수들은 대체로 0.0 ~ 1.0 범위의 실수를 리턴하는데,
C언어의 rand() 함수는 0 ~ 32767 까지의 정수(int)를 반환합니다.
정확하게 말하자면 0 ~ RAND_MAX 까지인데
비주얼C++의 경우 stdlib.h 헤더 파일에
#define RAND_MAX 0x7fff
이렇게 정의되어 있습니다. 16진수 0x7fff 는 10진수로 32767 이고
그래서 rand() 는 0 ~ 32767 까지의 난수가 출력됩니다.
다른 언어들의 경우처럼 실수 값을 반환하게 만들려면, 다음 예제에 있는
double randomDouble(void)
라는 함수를 사용하면 됩니다. 0.0 ~ 1.0 까지의 실수를 반환합니다.
소스 파일명: 0.cpp
그런데 rand() 함수의 한계 때문에, 실수들이 고작 32768 개의 해상도(?)를 가지더군요. 즉, 0과 1사이에 32768 종류의 실수만이 존재했습니다.
그래서 소팅을 해보면, 같은 값의 실수들이 몇 개씩 중복되어 발견되는 문제가 남아 있습니다.
▶▶ C언어] 랜덤 숫자 (난수 정수) 출력 - Random Numbers rand srand 함수
0~1까지의 실수 난수, 온라인 생성기: ▶▶ 0에서 1까지의 실수 난수 발생, 랜덤 생성; Float Random Maker
C언어의 rand() 함수는 0 ~ 32767 까지의 정수(int)를 반환합니다.
정확하게 말하자면 0 ~ RAND_MAX 까지인데
비주얼C++의 경우 stdlib.h 헤더 파일에
#define RAND_MAX 0x7fff
이렇게 정의되어 있습니다. 16진수 0x7fff 는 10진수로 32767 이고
그래서 rand() 는 0 ~ 32767 까지의 난수가 출력됩니다.
다른 언어들의 경우처럼 실수 값을 반환하게 만들려면, 다음 예제에 있는
double randomDouble(void)
라는 함수를 사용하면 됩니다. 0.0 ~ 1.0 까지의 실수를 반환합니다.
VC++: 실수 난수 생성 예제
소스 파일명: 0.cpp
#include <stdio.h>
#include <stdlib.h> // RAND_MAX
#include <Windows.h> // GetTickCount()
double randomDouble(void);
int main(void) {
// 난수 발생기 초기화, 비주얼C++용
srand(GetTickCount());
// 0 ~ 32767 까지의 정수 난수 생성
for (int i = 1; i <= 20; i++)
printf("%d\n", rand());
/* 실행 결과:
21149
29586
18653
28590
22933
18816
22220
9712
26847
3756
4708
9493
23532
20825
12074
30618
25615
19220
22471
22426
*/
// 0.00000000000000000 ~ 1.00000000000000000
// 범위의 실수 난수 생성
for (int i = 1; i <= 20; i++)
printf("%.17f\n", randomDouble());
/* 실행 결과:
0.78749961851863159
0.71807000946073796
0.09689626758629108
0.27829828791161837
0.79158909878841521
0.54560991241187784
0.50291451765495776
0.16968291268654440
0.46308786278878139
0.47267067476424451
0.96151615955076752
0.88122196111941897
0.64656514175847657
0.22769859920041505
0.00064088869899594
0.18887905514694661
0.43452253791924800
0.77205725272377701
0.52006591998046814
0.54249702444532610
*/
return 0;
}
double randomDouble(void) {
return (double) rand() / RAND_MAX;
}
#include <stdlib.h> // RAND_MAX
#include <Windows.h> // GetTickCount()
double randomDouble(void);
int main(void) {
// 난수 발생기 초기화, 비주얼C++용
srand(GetTickCount());
// 0 ~ 32767 까지의 정수 난수 생성
for (int i = 1; i <= 20; i++)
printf("%d\n", rand());
/* 실행 결과:
21149
29586
18653
28590
22933
18816
22220
9712
26847
3756
4708
9493
23532
20825
12074
30618
25615
19220
22471
22426
*/
// 0.00000000000000000 ~ 1.00000000000000000
// 범위의 실수 난수 생성
for (int i = 1; i <= 20; i++)
printf("%.17f\n", randomDouble());
/* 실행 결과:
0.78749961851863159
0.71807000946073796
0.09689626758629108
0.27829828791161837
0.79158909878841521
0.54560991241187784
0.50291451765495776
0.16968291268654440
0.46308786278878139
0.47267067476424451
0.96151615955076752
0.88122196111941897
0.64656514175847657
0.22769859920041505
0.00064088869899594
0.18887905514694661
0.43452253791924800
0.77205725272377701
0.52006591998046814
0.54249702444532610
*/
return 0;
}
double randomDouble(void) {
return (double) rand() / RAND_MAX;
}
그런데 rand() 함수의 한계 때문에, 실수들이 고작 32768 개의 해상도(?)를 가지더군요. 즉, 0과 1사이에 32768 종류의 실수만이 존재했습니다.
그래서 소팅을 해보면, 같은 값의 실수들이 몇 개씩 중복되어 발견되는 문제가 남아 있습니다.
▶▶ C언어] 랜덤 숫자 (난수 정수) 출력 - Random Numbers rand srand 함수
0~1까지의 실수 난수, 온라인 생성기: ▶▶ 0에서 1까지의 실수 난수 발생, 랜덤 생성; Float Random Maker
tag: cpp
C언어 | C/C++ (Visual C++)
<< Home