Saturday, April 21, 2007
PHP, 정규분포 난수 생성, 가우스 분포 랜덤 발생 함수; Normal Distribution
일반적인 난수 발생 함수는, 모든 난수들이 같은 확률로 나오는 단일분포(Uniform Distribution)의 난수를 출력합니다.
그런데 만약, 중간값이 가장 많이 나오고, 극단적인 값으로 갈수록 적게 나오는, 종 모양의 커브를 가진 정규분포(Normal Distribution) 즉, 가우스 분포(Gaussian Distribution)의 랜덤한 난수를 생성하려면 다음 예제의 gaussianRandom() 이라는 함수를 사용하면 됩니다.
소스 파일명: example.php
※ 아래 박스 클릭 후, 키보드 화살표 키로 좌우 스크롤 가능함
실행 결과 화면:
php example.php > out.html
이렇게 하면, 실행 결과가 out.html 이라는 파일로 저장됩니다.
일반적인 단일분포의 실수 난수 발생: ▶▶ PHP 프로그래밍] 실수 랜덤 난수 생성 0에서 1까지 출력, Float Random Rand
다른 언어로, 정규 분포 난수 구하기: ▶▶ 가우시안/가우스 랜덤/정규 분포 난수 구하기 함수 예제; C-자바-Perl-VBA; Gauss Random
정규분포 난수, 가우시안 랜덤 넘버 생성기: ▶▶ 정규분포 난수, 가우시안 랜덤 발생기; Normal Distribution Rand Generator
그런데 만약, 중간값이 가장 많이 나오고, 극단적인 값으로 갈수록 적게 나오는, 종 모양의 커브를 가진 정규분포(Normal Distribution) 즉, 가우스 분포(Gaussian Distribution)의 랜덤한 난수를 생성하려면 다음 예제의 gaussianRandom() 이라는 함수를 사용하면 됩니다.
가우시안 랜덤 생성 함수 예제
소스 파일명: example.php
※ 아래 박스 클릭 후, 키보드 화살표 키로 좌우 스크롤 가능함
<html>
<head>
<title>PHP Example</title>
</head>
<body>
<?php
// 정규분포 난수 30개 출력
for ($i = 0; $i < 30; $i++) {
echo gaussianRandom(), "<br />\n";
}
// 정규분포의 난수 1개 생성하여 반환하는 함수
// 평균 = 0, 표준편차 = 1
function gaussianRandom() {
do {
$v1 = 2 * (mt_rand() / mt_getrandmax()) - 1; // -1.0 ~ 1.0 까지의 값
$v2 = 2 * (mt_rand() / mt_getrandmax()) - 1; // -1.0 ~ 1.0 까지의 값
$s = $v1 * $v1 + $v2 * $v2;
} while ($s >= 1 || $s == 0);
$s = sqrt( (-2 * log($s)) / $s );
return $v1 * $s;
}
?>
</body>
</html>
<head>
<title>PHP Example</title>
</head>
<body>
<?php
// 정규분포 난수 30개 출력
for ($i = 0; $i < 30; $i++) {
echo gaussianRandom(), "<br />\n";
}
// 정규분포의 난수 1개 생성하여 반환하는 함수
// 평균 = 0, 표준편차 = 1
function gaussianRandom() {
do {
$v1 = 2 * (mt_rand() / mt_getrandmax()) - 1; // -1.0 ~ 1.0 까지의 값
$v2 = 2 * (mt_rand() / mt_getrandmax()) - 1; // -1.0 ~ 1.0 까지의 값
$s = $v1 * $v1 + $v2 * $v2;
} while ($s >= 1 || $s == 0);
$s = sqrt( (-2 * log($s)) / $s );
return $v1 * $s;
}
?>
</body>
</html>
실행 결과 화면:
D:\Z>php example.php
<html>
<head>
<title>PHP Example</title>
</head>
<body>
-2.0845950757016<br />
-0.35979500237827<br />
0.22218742820725<br />
1.0644497497177<br />
-2.0797003781112<br />
0.62844815275418<br />
-0.087172913620228<br />
0.6749800116894<br />
-0.2902088394042<br />
-0.57489043468833<br />
1.1934244904599<br />
0.35665574667421<br />
-0.050937176200436<br />
0.91071381643465<br />
0.39313853425754<br />
-0.29876583048131<br />
-1.9499570862601<br />
-0.26122493615939<br />
-0.32481931374634<br />
-0.25033262336947<br />
-2.3331444476871<br />
-1.2430127522752<br />
0.019581623954708<br />
1.3716530253342<br />
1.1714325229861<br />
0.20364060217821<br />
-0.37612762289786<br />
1.2359605343293<br />
1.6116787156969<br />
-0.69716116108472<br />
</body>
</html>
D:\Z>
D:\Z>php example.php > out.html
D:\Z>
<html>
<head>
<title>PHP Example</title>
</head>
<body>
-2.0845950757016<br />
-0.35979500237827<br />
0.22218742820725<br />
1.0644497497177<br />
-2.0797003781112<br />
0.62844815275418<br />
-0.087172913620228<br />
0.6749800116894<br />
-0.2902088394042<br />
-0.57489043468833<br />
1.1934244904599<br />
0.35665574667421<br />
-0.050937176200436<br />
0.91071381643465<br />
0.39313853425754<br />
-0.29876583048131<br />
-1.9499570862601<br />
-0.26122493615939<br />
-0.32481931374634<br />
-0.25033262336947<br />
-2.3331444476871<br />
-1.2430127522752<br />
0.019581623954708<br />
1.3716530253342<br />
1.1714325229861<br />
0.20364060217821<br />
-0.37612762289786<br />
1.2359605343293<br />
1.6116787156969<br />
-0.69716116108472<br />
</body>
</html>
D:\Z>
D:\Z>php example.php > out.html
D:\Z>
php example.php > out.html
이렇게 하면, 실행 결과가 out.html 이라는 파일로 저장됩니다.
일반적인 단일분포의 실수 난수 발생: ▶▶ PHP 프로그래밍] 실수 랜덤 난수 생성 0에서 1까지 출력, Float Random Rand
다른 언어로, 정규 분포 난수 구하기: ▶▶ 가우시안/가우스 랜덤/정규 분포 난수 구하기 함수 예제; C-자바-Perl-VBA; Gauss Random
정규분포 난수, 가우시안 랜덤 넘버 생성기: ▶▶ 정규분포 난수, 가우시안 랜덤 발생기; Normal Distribution Rand Generator
tag: php
PHP
<< Home