Study/기타자료

Gaussian Random (정규 분포 랜덤 난수 발생 함수)

greenpresent 2014. 9. 30. 17:05

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;

}