{{category Perl}} *Math::Random::MT::Autoとは メルセンヌツイスター法による疑似乱数列生成用Perlモジュールである。Math::Random::MTから大幅に強化されており、32bit整数を返すirand()や、リスト・配列の並び替えを行うshuffle()、正規乱数gaussian()、指数乱数exponential()、ポアソン乱数poisson()、二項乱数binomial()などが実装されている。詳しくは[CPANのドキュメント|http://search.cpan.org/~jdhedden/Math-Random-MT-Auto-6.14/lib/Math/Random/MT/Auto.pm]を参照。 *Math::Random::MT::Autoによるrand()関数の置き換え 以下の宣言をrand()関数より前に書くだけ。 use Math::Random::MT::Auto 'rand'; *Math::Random::MT::Autoを使用してマルチスレッドプログラムの子スレッドで利用される乱数列を統一する方法。 use strict; use threads; use threads::shared; use Thread::Semaphore; BEGIN { $Math::Random::MT::Auto::shared = 1; } use Math::Random::MT::Auto 'rand'; $| = 1; my $numthreads = 2; { my $semaphore = Thread::Semaphore->new($numthreads); for (my $i = 0; $i < 100; $i ++) { $semaphore->down; threads->new(\&randomnumber, $i + 1, $semaphore); } &joinThreads(); } sub randomnumber { my ($i, $semaphore) = @_; print($i . ': ' . int(rand(100)) . "\n"); $semaphore->up; } sub joinThreads { foreach my $thr (threads->list) { if ($thr->tid && !threads::equal($thr, threads->self)) { $thr->join; } } }