ついでに。
ボックスミューラー法の凄さを実感してみようの回。
いや、何となく書いたので。
Math::Random::MTが遅いので差が付く様子。乱数生成に時間がかからない場合(標準のrandとか)、算術平均の方が速かったりするようで。
あと算術平均の方を間違ってたので修正。なんで割っとんねん。
Ikuro 今月のコラム モンテカルロ法と乱数発生法 とかもどうぞ。
use Strict;
use Benchmark;
use Math::Random::MT qw(srand rand);
use Math::Trig;
# N(0,1)を作る。
my $N1 = 100000; #乱数を作る回数
my $N2 = 12; #中心極限定理
srand(1);
# 中心極限定理
my $t0 = new Benchmark;
foreach (1 .. $N1){
my $current = 0;
foreach (1 .. $N2){
$current = $current + rand(1);
}
my $rand = $current - 6; #12個足して6を引く
}
my $t1 = new Benchmark;
my $td = timediff($t1, $t0);
print "the code took:", timestr($td),"\n";
# ボックス・ミューラー法
my $t2 = new Benchmark;
foreach (1 .. $N1){
my $alpha = rand(1);
my $beta = rand(1);
my $rand1 = sqrt(-2 * log($alpha)) * sin(2 * pi * $beta);
my $rand2 = sqrt(-2 * log($beta)) * sin(2 * pi * $alpha);
}
my $t3 = new Benchmark;
my $td = timediff($t3, $t2);
print "the code took:", timestr($td),"\n";