Sunday, November 26, 2006
Perl/펄] 가우스 난수/가우시안 랜덤 발생 함수; Gaussian Random
가우스 분포 Gaussian (Normal) Distribution 의 무작위 난수(Random Number)를 발생시키는 함수를 만드는 방법입니다.
펄의 rand() 함수는 모든 숫자가 같은 확률로 나옵니다. 그렇지만 가우시안 분포의 난수들은 종 모양 즉 Bell Curve 를 가집니다.
평균(Mean)은 0
표준편차(Standard Deviation)는 1 입니다.
gaussianRandom 이라는 함수(Function)가 가우스 난수를 발생시키는 본체입니다.
그런데 실행 결과를 쉽게 알아보기 위해서, 가우스 난수들을 크기 순으로 정렬하여 출력하였습니다. (▶▶ 펄/Perl] 숫자 배열 정렬(소팅), sort 함수 사용법: Sort Number Array 참고)
실행 결과:
(50개의 가우스 난수들이 크기 순으로 소팅되어 출력됩니다.)
0에 가까운 숫자일수록 많이 나오고, 양극단의 숫자에 가까울수록 적게 나옵니다.
펄의 rand() 함수는 모든 숫자가 같은 확률로 나옵니다. 그렇지만 가우시안 분포의 난수들은 종 모양 즉 Bell Curve 를 가집니다.
평균(Mean)은 0
표준편차(Standard Deviation)는 1 입니다.
정규 분포 랜덤 함수; (Gaussian Random; Gauss)
#!/usr/bin/perl
use strict; use warnings;
my @a;
# 가우시안 난수 만들어, 배열에 넣기
for (my $i = 1; $i <= 50; $i++) {
push @a, &gaussianRandom;
}
@a = sort {$a <=> $b} @a; # 숫자 크기순 정렬
print $_, "\n" foreach (@a); # 배열 출력
sub gaussianRandom {
my ($v1, $v2, $s);
do {
$v1 = 2 * rand() - 1; # -1.0 ~ 1.0 까지의 값
$v2 = 2 * rand() - 1; # -1.0 ~ 1.0 까지의 값
$s = $v1 * $v1 + $v2 * $v2;
} while ($s >= 1 || $s == 0);
$s = sqrt( (-2 * log($s)) / $s );
return $v1 * $s;
}
use strict; use warnings;
my @a;
# 가우시안 난수 만들어, 배열에 넣기
for (my $i = 1; $i <= 50; $i++) {
push @a, &gaussianRandom;
}
@a = sort {$a <=> $b} @a; # 숫자 크기순 정렬
print $_, "\n" foreach (@a); # 배열 출력
sub gaussianRandom {
my ($v1, $v2, $s);
do {
$v1 = 2 * rand() - 1; # -1.0 ~ 1.0 까지의 값
$v2 = 2 * rand() - 1; # -1.0 ~ 1.0 까지의 값
$s = $v1 * $v1 + $v2 * $v2;
} while ($s >= 1 || $s == 0);
$s = sqrt( (-2 * log($s)) / $s );
return $v1 * $s;
}
gaussianRandom 이라는 함수(Function)가 가우스 난수를 발생시키는 본체입니다.
그런데 실행 결과를 쉽게 알아보기 위해서, 가우스 난수들을 크기 순으로 정렬하여 출력하였습니다. (▶▶ 펄/Perl] 숫자 배열 정렬(소팅), sort 함수 사용법: Sort Number Array 참고)
실행 결과:
(50개의 가우스 난수들이 크기 순으로 소팅되어 출력됩니다.)
-2.02342968236564
-2.01633266126133
-1.92046262081684
-1.88268227559408
-1.87234425636353
-1.7084184140151
-1.55708670410055
-1.40806593452702
-1.26982308262832
-1.20558537064328
-0.893057665444112
-0.841678446608124
-0.714984722829145
-0.68434655170491
-0.656702010516672
-0.580209670489763
-0.514854717366368
-0.513271130187537
-0.464387581603892
-0.399022963285861
-0.376596539266183
-0.310459549805852
-0.298734652357049
-0.289914098153749
-0.280792272265552
-0.271282165909082
-0.170171518058607
-0.150130296235735
-0.0888330149672835
-0.050405436892452
0.029519296099437
0.046417155572673
0.0477392620510434
0.12803999889267
0.177885547411445
0.194191891902784
0.262040174664585
0.26274333338753
0.366901456855656
0.54684412251242
0.793745666489606
0.863831701049744
0.948502638378713
0.978857255850438
1.14056397919119
1.29123177711295
1.40297677395333
1.43824583889233
1.62502462197163
3.18618764130342
-2.01633266126133
-1.92046262081684
-1.88268227559408
-1.87234425636353
-1.7084184140151
-1.55708670410055
-1.40806593452702
-1.26982308262832
-1.20558537064328
-0.893057665444112
-0.841678446608124
-0.714984722829145
-0.68434655170491
-0.656702010516672
-0.580209670489763
-0.514854717366368
-0.513271130187537
-0.464387581603892
-0.399022963285861
-0.376596539266183
-0.310459549805852
-0.298734652357049
-0.289914098153749
-0.280792272265552
-0.271282165909082
-0.170171518058607
-0.150130296235735
-0.0888330149672835
-0.050405436892452
0.029519296099437
0.046417155572673
0.0477392620510434
0.12803999889267
0.177885547411445
0.194191891902784
0.262040174664585
0.26274333338753
0.366901456855656
0.54684412251242
0.793745666489606
0.863831701049744
0.948502638378713
0.978857255850438
1.14056397919119
1.29123177711295
1.40297677395333
1.43824583889233
1.62502462197163
3.18618764130342
0에 가까운 숫자일수록 많이 나오고, 양극단의 숫자에 가까울수록 적게 나옵니다.
tag: perl
Perl | 펄
<< Home