真乱数をネットワーク越しに取得する。
擬似乱数の絡みで適当に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;
蛇足
やってみたけど、取得するのに時間かかって話にならんわ。わっはっは(笑)