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
おしまい。
Leave a Comment