Sunday, November 26, 2006
자바/Java] 가우시안(가우스;Gaussian) 난수 자체 구현; Gauss Random Number
java.util.Random 클래스의 nextGaussian() 이라는 메서드(함수)로 가우스 난수를 구할 수 있지만,
여기서는 자체적으로 직접 구현하는 방법을 소개합니다.
파일명: Foo.java
위의 소스 아래쪽의 gaussianRandom() 이라는 메소드가 "가우스 랜덤 넘버" 하나를 만들어 반환합니다.
출력 결과를 알아보기 쉽게 하기 위해서, 가우스 난수들을 크기순으로 소팅했습니다.
컴파일 및 실행 결과:
0에 가까운 숫자일수록 많이 나오고, 양극단의 숫자에 가까울수록 적게 나옵니다. (반면 일반적인 랜덤 함수는 모든 숫자가 같은 확률로 나옵니다.)
java.util.Random 클래스의 nextGaussian() 메서드 사용 예제는 여기에 있습니다: ▶▶ 자바/Java] 정규분포, 가우스(Gaussian) 랜덤(난수) 발생 - Gaussian Random Numbers 출력 예제
▶▶ Java/자바] 한국 남녀 키(신장)의 평균, 표준편차 랜덤 난수 생성; Human Stature Random Number
다른 언어로, 정규 분포 난수 구하기: ▶▶ 가우시안/가우스 랜덤/정규 분포 난수 구하기 함수 예제; C-자바-Perl-VBA; Gauss Random
여기서는 자체적으로 직접 구현하는 방법을 소개합니다.
정규 분포 랜덤 난수 발생 함수; (Gaussian Random; Gauss)
파일명: Foo.java
import java.util.*; // Arrays.sort()에 필요
public class Foo {
public static void main(String[] args) {
final int SIZE = 50; // 배열 크기 정의
double[] d = new double[SIZE];
for (int i = 0; i < SIZE; i++)
d[i] = gaussianRandom(); // 가우스 난수 만들어 배열에 넣기
Arrays.sort(d); // 편의상 배열 정렬
for (int i = 0; i < SIZE; i++)
System.out.println(d[i]); // 배열 출력
}
public static double gaussianRandom() {
double v1, v2, s;
do {
v1 = 2 * Math.random() - 1; // -1.0 ~ 1.0 까지의 값
v2 = 2 * Math.random() - 1; // -1.0 ~ 1.0 까지의 값
s = v1 * v1 + v2 * v2;
} while (s >= 1 || s == 0);
s = Math.sqrt( (-2 * Math.log(s)) / s );
return v1 * s;
}
}
public class Foo {
public static void main(String[] args) {
final int SIZE = 50; // 배열 크기 정의
double[] d = new double[SIZE];
for (int i = 0; i < SIZE; i++)
d[i] = gaussianRandom(); // 가우스 난수 만들어 배열에 넣기
Arrays.sort(d); // 편의상 배열 정렬
for (int i = 0; i < SIZE; i++)
System.out.println(d[i]); // 배열 출력
}
public static double gaussianRandom() {
double v1, v2, s;
do {
v1 = 2 * Math.random() - 1; // -1.0 ~ 1.0 까지의 값
v2 = 2 * Math.random() - 1; // -1.0 ~ 1.0 까지의 값
s = v1 * v1 + v2 * v2;
} while (s >= 1 || s == 0);
s = Math.sqrt( (-2 * Math.log(s)) / s );
return v1 * s;
}
}
위의 소스 아래쪽의 gaussianRandom() 이라는 메소드가 "가우스 랜덤 넘버" 하나를 만들어 반환합니다.
출력 결과를 알아보기 쉽게 하기 위해서, 가우스 난수들을 크기순으로 소팅했습니다.
컴파일 및 실행 결과:
D:\Z>javac Foo.java && java Foo
-2.132084165440264
-1.8797140083473551
-1.8783599881938347
-1.5777994537041908
-1.5373755768364852
-1.4411285894218837
-1.4341236220849631
-1.357940215562526
-1.2063247809542141
-1.1999377390349115
-1.180848609731194
-0.979635410009202
-0.874804796029493
-0.716332482602338
-0.6398680614815994
-0.6165767635651549
-0.5312493877959292
-0.49262259085108734
-0.48662907359084734
-0.3533616481982741
-0.24777202508635732
-0.23208552559376514
-0.1832688119350085
-0.04969234751561035
0.01447268507048514
0.12179669638268552
0.12242841272760417
0.1350055666896621
0.17629202319867104
0.23118057403642095
0.28879987828068193
0.28998535559117283
0.3881026372900624
0.3925536211327726
0.43621425353703214
0.45307780910998297
0.49100305116244924
0.5921390138122935
0.6433218261644735
0.6624223092018567
0.6646493269230213
0.7022253858257572
1.0436976988369973
1.127918453214893
1.1717282042764685
1.1901723943887463
1.5008490274789665
1.7758392898261126
1.9640375701715793
2.6692188711517018
D:\Z>
-2.132084165440264
-1.8797140083473551
-1.8783599881938347
-1.5777994537041908
-1.5373755768364852
-1.4411285894218837
-1.4341236220849631
-1.357940215562526
-1.2063247809542141
-1.1999377390349115
-1.180848609731194
-0.979635410009202
-0.874804796029493
-0.716332482602338
-0.6398680614815994
-0.6165767635651549
-0.5312493877959292
-0.49262259085108734
-0.48662907359084734
-0.3533616481982741
-0.24777202508635732
-0.23208552559376514
-0.1832688119350085
-0.04969234751561035
0.01447268507048514
0.12179669638268552
0.12242841272760417
0.1350055666896621
0.17629202319867104
0.23118057403642095
0.28879987828068193
0.28998535559117283
0.3881026372900624
0.3925536211327726
0.43621425353703214
0.45307780910998297
0.49100305116244924
0.5921390138122935
0.6433218261644735
0.6624223092018567
0.6646493269230213
0.7022253858257572
1.0436976988369973
1.127918453214893
1.1717282042764685
1.1901723943887463
1.5008490274789665
1.7758392898261126
1.9640375701715793
2.6692188711517018
D:\Z>
0에 가까운 숫자일수록 많이 나오고, 양극단의 숫자에 가까울수록 적게 나옵니다. (반면 일반적인 랜덤 함수는 모든 숫자가 같은 확률로 나옵니다.)
java.util.Random 클래스의 nextGaussian() 메서드 사용 예제는 여기에 있습니다: ▶▶ 자바/Java] 정규분포, 가우스(Gaussian) 랜덤(난수) 발생 - Gaussian Random Numbers 출력 예제
▶▶ Java/자바] 한국 남녀 키(신장)의 평균, 표준편차 랜덤 난수 생성; Human Stature Random Number
다른 언어로, 정규 분포 난수 구하기: ▶▶ 가우시안/가우스 랜덤/정규 분포 난수 구하기 함수 예제; C-자바-Perl-VBA; Gauss Random
tag: java
자바 | Java
<< Home