ついでに。

ボックスミューラー法の凄さを実感してみようの回。
いや、何となく書いたので。

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";