PHP, 정규분포 난수 생성, 가우스 분포 랜덤 발생 함수; Normal Distribution
Saturday, April 21, 2007
스폰서 링크일반적인 난수 발생 함수는, 모든 난수들이 같은 확률로 나오는 단일분포(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
☞ PHP
그런데 만약, 중간값이 가장 많이 나오고, 극단적인 값으로 갈수록 적게 나오는, 종 모양의 커브를 가진 정규분포(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
☞ PHP
Post a Comment
<< Home