コアperl関数rand()はスレッドセーフではないため、スレッド化されたモンテカルロシミュレーションでは乱数が必要です。
さまざまな乱数ジェネレーターのCPANで、スレッドセーフなメモを見つけるのに問題があります。Google検索を行うたびに、C / C ++ / python/perl以外のものが乱雑になります。助言がありますか?
コアperl関数rand()はスレッドセーフではないため、スレッド化されたモンテカルロシミュレーションでは乱数が必要です。
さまざまな乱数ジェネレーターのCPANで、スレッドセーフなメモを見つけるのに問題があります。Google検索を行うたびに、C / C ++ / python/perl以外のものが乱雑になります。助言がありますか?
rand
Windows ではモンテカルロにビルトインを使用しないでください。少なくとも、試してください:
my %r = map { rand() => undef } 1 .. 1_000_000;
print scalar keys %r, "\n";
何も変更されていない場合は32768
、どんな種類の深刻な作業にもまったく適していない印刷が行われるはずです。また、より大きな数値が出力されたとしても、シミュレーションには既知の優れた品質を備えた PRNG を使用することをお勧めします。
Math::Random::MTを使用できます。
Math::Random::MT
独自のシード配列を使用して、各スレッドで新しいオブジェクトをインスタンス化できます。Mersenne Twisterは、シミュレーションに適した特性を備えています。
システムにありますか/dev/urandom
?
BEGIN {
open URANDOM, '<', '/dev/urandom';
}
sub urand { # drop in replacement for rand.
my $expr = shift || 1;
my $x;
read URANDOM, $x, 4;
return $expr * unpack("I", $x) / (2**32);
}
rand はスレッド セーフです。「スレッド セーフ」の定義が間違っていると思います。「スレッド セーフ」でない場合は、プログラム/関数が「共有」データ構造を変更しているため、スレッド モードでの実行が安全ではなくなります。 .
Rand 関数のドキュメントを確認してください。引数として EXPR を取ることに注意してください。すべてのスレッドで異なる EXPR を指定できます。