什么是perl的线程安全随机数生成器?

时间:2013-03-22 15:42:01

标签: windows multithreading perl random thread-safety

核心perl函数rand()不是线程安全的,我需要在线程蒙特卡罗模拟中使用随机数。

我在各种随机数发生器上找到CPAN中的任何音符时遇到哪些(如果有的话)都是线程安全的,而且我做的每一次谷歌搜索都会一直乱用C / C ++ / python / anything但是perl。有什么建议吗?

3 个答案:

答案 0 :(得分:2)

Do not use built-in rand for Monte Carlo on 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具有良好的模拟属性。

答案 1 :(得分:1)

您的系统上有/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);
}

答案 2 :(得分:-2)

rand是线程安全的,我认为你对“线程安全”的含义有错误的定义,如果它不是“线程安全的”它意味着程序/函数正在修改它的“共享”数据结构,使其在线程模式不安全。

检查Rand功能文档,注意它以EXPR作为参数,在每个线程中都可以提供不同的EXPR。

http://perldoc.perl.org/functions/rand.html