mwultong Blog ... 프로그래밍 / 계산기

컴퓨터 엑셀 워드 포토샵 구글어스 WINDOWS JAVASCRIPT JAVA C++

 
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());
    //

  }
}



자바의 난수 발생 메소드(함수)들은, 지정한 범위의 숫자들이 모두 균일하게 나옵니다. 그런데 중간값이 가장 많이 나오고 양쪽의 극단적인 값은 가장 적게 나오며, 그러한 값들이 부드러운 곡선을 이루는 난수를 발생시키려면, 위와 같이 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

...이하 생략







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;
    }
 }

위의 알고리즘은
여기 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

0 Comments:

<< Home RSS 2.0 feed

구글 Google 에서 제공하는 무료 블로그 서비스인 블로거 Blogger 의 인터넷 주소는 www.blogger.com 입니다. Blogger 에 블로그를 만들면, blogspot.com 이라는 주소에 블로그가 생성됩니다.
블로그를 직접 방문하지 않고도 최신 게시물을 구독하려면 RSS 2.0 feed 주소를 리더기에 등록하시면 됩니다.
Previous Posts
Monthly Archives
Top