ついでに。
ボックスミューラー法の凄さを実感してみようの回。
いや、何となく書いたので。
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";