본문 바로가기

UNIX_LINUX_C_C++

[window] 가우시안 분포 랜덤 생성 함수/알고리즘

출처 : 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