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

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

 
Sunday, November 26, 2006

자바/Java] 가우시안(가우스;Gaussian) 난수 자체 구현; Gauss Random Number


java.util.Random 클래스의 nextGaussian() 이라는 메서드(함수)로 가우스 난수를 구할 수 있지만,

여기서는 자체적으로 직접 구현하는 방법을 소개합니다.

정규 분포 랜덤 난수 발생 함수; (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;
  }


}


위의 소스 아래쪽의 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>


0에 가까운 숫자일수록 많이 나오고, 양극단의 숫자에 가까울수록 적게 나옵니다. (반면 일반적인 랜덤 함수는 모든 숫자가 같은 확률로 나옵니다.)



java.util.Random 클래스의 nextGaussian() 메서드 사용 예제는 여기에 있습니다: ▶▶ 자바/Java] 정규분포, 가우스(Gaussian) 랜덤(난수) 발생 - Gaussian Random Numbers 출력 예제

▶▶ Java/자바] 한국 남녀 키(신장)의 평균, 표준편차 랜덤 난수 생성; Human Stature Random Number


다른 언어로, 정규 분포 난수 구하기: ▶▶ 가우시안/가우스 랜덤/정규 분포 난수 구하기 함수 예제; C-자바-Perl-VBA; Gauss Random




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