トップ 差分 一覧 Farm ソース 検索 ヘルプ PDF RSS ログイン

Math::Random::MT::Auto

[Perl]

Math::Random::MT::Autoとは

メルセンヌツイスター法による疑似乱数列生成用Perlモジュールである。Math::Random::MTから大幅に強化されており、32bit整数を返すirand()や、リスト・配列の並び替えを行うshuffle()、正規乱数gaussian()、指数乱数exponential()、ポアソン乱数poisson()、二項乱数binomial()などが実装されている。詳しくはCPANのドキュメントを参照。

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

最終更新時間:2009年07月06日 21時19分16秒