출처 : http://kwakdaeho.egloos.com/4161095
<아래 예제는, Gauss(가우스) 분포의 double형 난수 1000개를 생성하여 화면에 출력합니다.>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <Windows.h>
double gaussianRandom(void);
void main(void) {
srand(GetTickCount());
for (int i = 1; i <= 1000; i++)
printf("%.17f\n", gaussianRandom());
}
double gaussianRandom(void) {
static double V1, V2, S;
static int phase = 0;
double X;
if (phase == 0) {
do {
double U1 = (double)rand() / RAND_MAX;
double U2 = (double)rand() / RAND_MAX;
V1 = 2 * U1 - 1;
V2 = 2 * U2 - 1;
S = V1 * V1 + V2 * V2;
} while (S >= 1 || S == 0);
X = V1 * sqrt(-2 * log(S) / S);
} else X = V2 * sqrt(-2 * log(S) / S);
phase = 1 - phase;
return X;
}
조금 더 간결하게... (위와 결과는 같다.)
#include <stdio.h>
#include <math.h>
#include <Windows.h>
double gaussianRandom(void);
int main(void) {
srand(GetTickCount());
for (int i = 1; i <= 50; i++)
printf("%.17f\n", gaussianRandom());
return 0;
}
double gaussianRandom(void) {
double v1, v2, s;
do {
v1 = 2 * ((double) rand() / RAND_MAX) - 1; // -1.0 ~ 1.0 까지의 값
v2 = 2 * ((double) rand() / RAND_MAX) - 1; // -1.0 ~ 1.0 까지의 값
s = v1 * v1 + v2 * v2;
} while (s >= 1 || s == 0);
s = sqrt( (-2 * log(s)) / s );
return v1 * s;
}
▶ 실수를 난수로 발생시키는 알고리즘
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
srand(GetTickCount());
int i;
double max=32767;
for(i=1;i<=10;i++)
printf("%f\n", rand()/max);
return 0;
}
'UNIX_LINUX_C_C++' 카테고리의 다른 글
strsep C 소스 (0) | 2012.02.02 |
---|---|
Diffie-Hellman 키분배 알고리즘 (0) | 2012.02.02 |
[TMAX] 비요청 메세지를 보내기 (0) | 2012.01.17 |
IBM AIX 에서 IP 주소 알아내기 (0) | 2012.01.13 |
unix 에서 dir 함수 사용 - 링크 (0) | 2011.12.19 |