Gaussian Random (정규 분포 랜덤 난수 발생 함수)
Gaussian Random (정규 분포 랜덤 난수 발생 함수)
-평균 0, 분산
#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 <math.h>
#include <Windows.h>
double gaussianRandom(double average, double stdev);
int main(void) {
srand(GetTickCount());
for (int i = 1; i <= 50; i++)
// 평균은 -3.6 이고, 표준편차는 0.5 의 경우
printf("%.17f\n", gaussianRandom(-3.6, 0.5));
return 0;
}
double gaussianRandom(double average, double stdev) {
double v1, v2, s, temp;
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 );
temp = v1 * s;
temp = (stdev * temp) + average;
return temp;
}