Saturday, September 23, 2006
자바/Java] 정규분포, 가우스(Gaussian) 랜덤(난수) 발생 - Gaussian Random Numbers 출력 예제
가우스 분포를 갖는 난수 발생 함수 사용 예제
파일명: Foo.java
import java.util.Random;
public class Foo {
public static void main(String args[]) {
Random oRandom = new Random();
// 분포가 가운데에서 종 모양을 이루는 가우시안 랜덤 실수 1000개 출력
// 평균 0.0 표준편차 1.0의 Gauss(가우스) 분포의 double형 난수 생성
for (int i = 1; i <= 1000; i++)
System.out.println(oRandom.nextGaussian());
// 이것은 0.0 ~ 1.0 까지 균일한 분포로 랜덤한 실수 1000개 만들기 예제
// for (int i = 1; i <= 1000; i++)
// System.out.println(oRandom.nextDouble());
//
}
}
public class Foo {
public static void main(String args[]) {
Random oRandom = new Random();
// 분포가 가운데에서 종 모양을 이루는 가우시안 랜덤 실수 1000개 출력
// 평균 0.0 표준편차 1.0의 Gauss(가우스) 분포의 double형 난수 생성
for (int i = 1; i <= 1000; i++)
System.out.println(oRandom.nextGaussian());
// 이것은 0.0 ~ 1.0 까지 균일한 분포로 랜덤한 실수 1000개 만들기 예제
// for (int i = 1; i <= 1000; i++)
// System.out.println(oRandom.nextDouble());
//
}
}
자바의 난수 발생 메소드(함수)들은, 지정한 범위의 숫자들이 모두 균일하게 나옵니다. 그런데 중간값이 가장 많이 나오고 양쪽의 극단적인 값은 가장 적게 나오며, 그러한 값들이 부드러운 곡선을 이루는 난수를 발생시키려면, 위와 같이 Random 클래스의 nextGaussian() 메소드를 사용합니다. (일반 난수 발생법은 여기에: ▶▶ [자바/Java] 랜덤(난수) 정수/실수/불린 출력 예제 - Random, nextInt() 메소드)
위의 코드 박스의 예제를 실행한 결과:
-0.7700350191629152
-0.7775141414748729
0.0852805465588591
-1.102381138132199
0.6157885427074746
0.9977509006626814
1.486152666702072
0.8801040678458519
-1.4263983517336825
2.005608609950296
0.07890264912715708
-0.18441624291164838
-0.07353853279984125
1.1935119067519735
-0.45407037380611315
0.3882826613350095
0.4213023681417606
1.5632994606606816
-0.12173531278597248
-0.47210272835236505
-0.32965447118928937
-1.466829065613943
-0.46379370768041617
1.3554519117561945
-0.5293156681676003
0.7990740195377741
1.0215646581718913
-0.21498670825241603
-2.3839680302986443
-0.4510426727339296
0.0012643916031950834
1.3304117334257748
0.2138171248590456
-0.16357893241935245
-0.423917917985468
-0.5116896736879039
-0.10350225134270985
-0.5637113270019813
-0.5722515832380194
...이하 생략
-0.7775141414748729
0.0852805465588591
-1.102381138132199
0.6157885427074746
0.9977509006626814
1.486152666702072
0.8801040678458519
-1.4263983517336825
2.005608609950296
0.07890264912715708
-0.18441624291164838
-0.07353853279984125
1.1935119067519735
-0.45407037380611315
0.3882826613350095
0.4213023681417606
1.5632994606606816
-0.12173531278597248
-0.47210272835236505
-0.32965447118928937
-1.466829065613943
-0.46379370768041617
1.3554519117561945
-0.5293156681676003
0.7990740195377741
1.0215646581718913
-0.21498670825241603
-2.3839680302986443
-0.4510426727339296
0.0012643916031950834
1.3304117334257748
0.2138171248590456
-0.16357893241935245
-0.423917917985468
-0.5116896736879039
-0.10350225134270985
-0.5637113270019813
-0.5722515832380194
...이하 생략
Gaussian 함수 소스/알고리즘
synchronized public double nextGaussian() {
if (haveNextNextGaussian) {
haveNextNextGaussian = false;
return nextNextGaussian;
} else {
double v1, v2, s;
do {
v1 = 2 * nextDouble() - 1; // between -1.0 and 1.0
v2 = 2 * nextDouble() - 1; // between -1.0 and 1.0
s = v1 * v1 + v2 * v2;
} while (s >= 1 || s == 0);
double multiplier = Math.sqrt(-2 * Math.log(s)/s);
nextNextGaussian = v2 * multiplier;
haveNextNextGaussian = true;
return v1 * multiplier;
}
}
if (haveNextNextGaussian) {
haveNextNextGaussian = false;
return nextNextGaussian;
} else {
double v1, v2, s;
do {
v1 = 2 * nextDouble() - 1; // between -1.0 and 1.0
v2 = 2 * nextDouble() - 1; // between -1.0 and 1.0
s = v1 * v1 + v2 * v2;
} while (s >= 1 || s == 0);
double multiplier = Math.sqrt(-2 * Math.log(s)/s);
nextNextGaussian = v2 * multiplier;
haveNextNextGaussian = true;
return v1 * multiplier;
}
}
위의 알고리즘은
여기 Java API 문서에 있는 것입니다.
java.util.Random 클래스를 사용하지 않고, 가우스 난수 발생을 자체 구현: ▶▶ 자바/Java] 가우시안(가우스;Gaussian) 난수 자체 구현; Gauss Random Number
엑셀 VBA매크로를 사용하여, "정규 분포 난수(가우스 분포 난수)"를 생성하는 방법: ▶▶ Excel/엑셀] 가우스 난수/정규분포 랜덤 생성 함수; Gaussian Random VBA 매크로
C언어로 된 가우스 함수는 여기에 있습니다: ▶▶ C언어] 정규분포, 가우스(Gaussian) 랜덤(난수) 발생 - Gaussian Random Numbers 출력 예제
정규분포 난수, 가우시안 랜덤 넘버 생성기 (온라인): ▶▶ 정규분포 난수, 가우시안 랜덤 발생기; Normal Distribution Rand Generator
tag: java
자바 | Java
<< Home