0

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

我很难在 CPAN 中找到关于那里的各种随机数生成器的任何注释(如果有的话)是线程安全的,而且我所做的每个谷歌搜索都被 C/C++/python/除了 perl 之外的任何东西弄乱了。有什么建议么?

4

3 回答 3

2

rand不要在 Windows 上使用内置的Monte Carlo 。至少,尝试:

my %r = map { rand() => undef } 1 .. 1_000_000;
print scalar keys %r, "\n";

如果没有任何变化,它应该打印32768完全不适合任何严肃工作的内容。而且,即使它确实打印了一个更大的数字,你最好还是坚持使用具有已知良好模拟质量的 PRNG。

您可以使用Math::Random::MT

Math::Random::MT您可以在每个线程中使用自己的种子数组实例化一个新对象。Mersenne Twister具有良好的模拟特性。

于 2013-03-22T18:16:08.547 回答
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);
}
于 2013-03-22T16:32:47.213 回答
-2

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

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

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

于 2013-03-22T16:47:20.800 回答