2009년 06월 13일
[C#] 정규분포(가우스 분포) 생성기
C++ Builder에는 gauss 난수 발생 함수가 내장함수로 제공되었는데, (randG())
Visual C#에서는 직접 만들어 써야 한다.
===============================================================
private double gauss_N(Random rnd)
{
// 평균이 0이고, 표준편차가 1 가우스 난수를 발생
double v1, v2, s;
do
{
v1 = rnd.Next(-500000, 500001) / 500000.0; // -1.0 ~ 1.0 까지의 값을 v1에 저장
v2 = rnd.Next(-500000, 500001) / 500000.0; // -1.0 ~ 1.0 까지의 값을 v1에 저장
s = v1 * v1 + v2 * v2;
} while (s >= 1 || s == 0);
s = Math.Sqrt((-2.0 * Math.Log(s)) / s);
return v1 * s;
}
=================================================================
난수를 생성하려면, Random 변수를 사용하여야 하는데 변수 생성시마다 동일한 seed 값으로 초기화 되므로
gauss 함수 내에서 Random 변수를 선언하는 것은 좋지 않다.
따라서, Random 변수 rnd는 메인 class의 글로벌 변수로 1번만 초기화 한다.
==================================================================
Random rnd = new Random(Convert.ToInt32(DateTime.Now.Hour) * 360000 + Convert.ToInt32(DateTime.Now.Minute) * 6000 + Convert.ToInt32(DateTime.Now.Second) * 100 + Convert.ToInt32(DateTime.Now.Millisecond));
==================================================================
// 함수 호출시에..
double x = gauss_N(rnd);
==================================================================
# by | 2009/06/13 08:04 | 프로그래밍 | 트랙백 | 덧글(0)




