Perl5 リファレンス



srand

【文法】

srand EXPR


【説明】

rand 関数に使う種に、ランダムな数字を割り当てます。EXPR が省略された場合には、セ
ミランダム値が使われます。セミランダム値は、(システムが /dev/urandom をサポート
していれば)カーネルから供給されるか、もしくは現在時刻とプロセス ID そして他の何
かを使って生成されます。Perl のバージョンが 5.004 より前では、デフォルトの種は、
現在時刻だけでした。これはとりわけ良い種とはいえず、多くの古いプログラムは、自身
の種を生成しています。しかし、今後はもうそのようなことは不要となります。

事実、通常 srand 関数を呼び出すことはまったく不要です。なぜなら、もし明示的に 
srand 関数が呼び出されなかったとしても、初めて rand 関数が呼び出されたときに、暗
黙的に srand 関数が呼び出されるからです。しかし、Perl のバージョンが 5.004 より
前の場合においては、暗黙的に srand 関数は呼び出されません。そのため、もしあなた
のスクリプトが古い Perl バージョンで使われるのであれば、srand 関数を呼び出してく
ださい。

暗号化の目的においては、デフォルトの種よりさらにランダムなものを使う必要があるこ
とに注意してください。
Checksumming the compressed output of one or more rapidly changing operating 
system status programs is the usual method.  For example:

    srand (time ^ $$ ^ unpack "%L*", `ps axww | gzip`);

もし、とりわけこのことに関心があるなら、CPAN の `Math::TrulyRandom' モジュールを
ご覧下さい。

何をしているのか、なぜそれをしているのかを正しく理解していない限り、srand 関数を
複数回、呼び出さないようにしてください。この関数の目的は、プログラム起動のたびご
とに rand 関数が異なる結果を生成することができるように、rand 関数に"種をまく"こ
となのです。プログラムの最初に一度だけ rand 関数を呼び出すだけでいいのです。そう
しなければ、ランダム数字を取得できないのです!

(CGI スクリプトのような)何度も呼び出されるプログラムで、種を取得するために単に

    time ^ $$

とだけ使っている場合、

    a^b == (a+1)^(b+1)

という数学的特性の餌食に陥る可能性があります。だからそうしないで下さいね。



Perl5リファレンスに戻る