真乱数をネットワーク越しに取得する。

擬似乱数の絡みで適当にWebをあさっていたところ、radiumsoftware.comなんて記事をみつけ、リンク先を読んでみた。
面白い。実に面白い。
再現性? 知るか! なその態度。実に楽しい。
なので、Perlのモジュールだが作ってみた。

NetworkRandom.pmの使い方。

use NetworkRandom;
my $dice = NetworkRandom->new;
my $num = $dice->rand; # 0から255までの乱数を発生(取得)する。
$num = $dice->rand(2); # 数値を与えると、結果が変化する。1の場合は、2^8-1まで、2の場合は2^16-1まで、3の場合は2^24-1まで、以下同様。
# randを引数なしで呼び出すと、デフォルト値の1が指定される。
$dice->byte(2); # デフォルトの値を変更する。
my $default = $dice->byte; # 現在のデフォルトの値を取得する。

NetworkRandom.pm

package NetworkRandom;
use base qw ( Class::Accessor );
__PACKAGE__->mk_accessors(qw(
	byte
));
use LWP::UserAgent;
our $url = 'http://www.fourmilab.ch/cgi-bin/Hotbits?fmt=c&nbytes=';
our $ua = undef;
our $default_byte = 1;
sub ua {
	my $invocant = shift;
	@_ and $ua = shift;
	$ua ||= LWP::UserAgent->new;
	return $ua;
}
sub rand {
	my $self = shift;
	my $byte = undef;
	@_ and $byte = shift;
	$byte ||= $self->byte;
	$byte ||= $default_byte;
	my $ua = $self->ua;
	my $get_url = $url.$byte;
	my $res = $ua->get($get_url);
	$res->is_success or return undef;
	my $content = $res->content;
	$content =~ s/.+\{\s+//;
	$content =~ s/\s+\}\;//;
	$content =~ s/\s//g;
	my @result = split /\,/, $content;
	my $result = 0;
	$result = shift @result;
	while ( @result ) {
		$result *= 256;
		$result += shift @result;
	}
	return $result;
}
1;

蛇足

やってみたけど、取得するのに時間かかって話にならんわ。わっはっは(笑)