=encoding euc-jp =head1 名前 Thread::Rand - スレッド間で再現可能な乱数列 =head1 概要 use Thread::Rand; # rand()とsrand()をエクスポート use Thread::Rand (); # sbusを完全修飾で呼ばなければならない BEGIN {Thread::Rand->global} # グローバルにrand()とsrand()を置き換え =head1 説明 *** A note of CAUTION *** This module only functions on Perl versions 5.8.0 and later. And then only when threads are enabled with -Dusethreads. It is of no use with any version of Perl before 5.8.0 or without threads enabled. ************************* *** 注 意 書 き *** このモジュールは、Perlのバージョン5.8.0以降で、かつ、-Dusethreads オプションでスレッドが有効になっている場合にのみ機能する。5.8.0以前、 あるいはスレッドが有効になっていない場合は、使うことができない。 ************************* The Thread::Rand module allows you to create repeatable random sequences between different threads. Without it, repeatable random sequences can only be created B a thread. Thread::Randモジュールを使うと、異なるスレッド間で再現可能な乱数列を つくりだせる。このモジュールを使わないと、再現可能な乱数列は一つの スレッドB<の中>でのみ生成される。 =head1 サブルーチン There are only two subroutines. 二つのサブルーチンがあるだけだ。 =head2 rand my $value = rand(); # 0から1の間の値 my $value = rand( number ); # 0からnumber-1を含む間の値 The "rand" subroutine functions exactly the same as the normal rand() function. "rand"サブルーチンは通常のrand()関数と全く同じように機能する。 =head2 srand srand( usethis ); The "srand" subroutine functions exactly the same as the normal srand() function. "srand"サブルーチンは通常のsrand()関数と全く同じように機能する。 =head1 クラスメソッド There is one class method. 一つのクラスメソッドがある。 =head2 global use Thread::Rand (); BEGIN {Thread::Rand->global} The "global" class method allows you to replace the rand() and srand() system functions in all programs by the version supplied by Thread::Rand. To ensure that the right subroutines are called, you B call this class method from within a BEGIN {} block. "global"クラスメソッドは、全プログラム中のrand()およびsrand()システム関数を Thread::Randが提供するバージョンに置き換えてくれる。正しいサブルーチンを 呼び出すことを保証するために、BEGIN {} ブロック内でこのクラスメソッドを 呼び出さなければB<ならない>。 =head1 必要なモジュール load (どのバージョンでも) Thread::Tie (0.09) =head1 警告 A bug in Perl 5.8.0 causes random sequences to be identical in threads if the rand() function was called in the parent thread. You can circumvent this problem by adding a CLONE subroutine thus: Perl 5.8.0のバグにより、親スレッドでrand()関数を呼び出すと、乱数列は 子スレッド内で同じになってしまう。CLONEサブルーチンを以下のように加える ことで、この問題を回避できる。 sub CLONE { srand() } # 5.8.0のバグに対して必要な処置 This will make sure that each thread gets its own unique seed and therefore its own unique sequence of random numbers. Alternately, you could also solve this with Thread::Rand and a call to the L class method thus: これにより、各スレッドはそれぞれ一意の種を得ることが保証され、ゆえに 一意な乱数の連続を得られる。これとは別に、Thread::RandとL クラスメソッドを使って、この問題を解決できる: use Thread::Rand (); BEGIN {Thread::Rand->global} You should however keep monitoring whether future versions of Perl will have this problem fixed. You can then take these circumventions out again. しかし、将来のPerlのバージョンではこの問題が修正されているかどうか 観察し続けたほうが良い。修正されたときにはこの回避方法を取り除ける。 =head1 作者 Elizabeth Mattijsen, . Please report bugs to . =head1 著作権 Copyright (c) 2002-2003 Elizabeth Mattijsen . All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =head1 参考 L.