Perlでsrandに大き過ぎる値を入れると?

とりあえず、試してみたのでメモ。

Perlのバージョンは5.18.1。
以下の結果から察するに64bit版。
$ perl -E "say sprintf( '0x%X', -1 );"
0xFFFFFFFFFFFFFFFF

で、以下のコードを実行してみる。

use strict;
use warnings;
use v5.10;

my $str = '123456789012345678901234567890';
say $str;
say '---------------------------';
srand( $str );
say rand();
say '---------------------------';
my $val = int($str);
say $val;
say '---------------------------';
srand( $val );
say rand();
say '---------------------------';
srand( 0xFFFF_FFFF );
say rand();

実行すると、こんな感じ。
$ perl aaa.pl
123456789012345678901234567890
---------------------------
Integer overflow in srand at aaa.pl line 8.
0.300025727440701
---------------------------
1.23456789012346e+29
---------------------------
Integer overflow in srand at aaa.pl line 14.
0.300025727440701
---------------------------
0.300025727440701

分かったこと
大き過ぎる値は、符号なし32bit変数の最大値に変換されちゃうっぽい。

まとめ
srandに引数として与えるのは、
0〜4294967295(0xFFFF_FFFF)だけにする。
安全のため、小数点以下を含む値は渡さない。(*1)

おまけ

use strict;
use warnings;
use v5.10;

say '---------------------------';
srand( 1 );
say rand();
say '---------------------------';
srand( -1 );
say rand();

$ perl bbb.pl
---------------------------
0.0416303447718782
---------------------------
0.0416303447718782

おしまい。

(*1) http://perldoc.jp/func/srand

Leave a Comment