核心 perl 函数 rand() 不是线程安全的,我需要在线程化的蒙特卡罗模拟中使用随机数。
我很难在 CPAN 中找到关于那里的各种随机数生成器的任何注释(如果有的话)是线程安全的,而且我所做的每个谷歌搜索都被 C/C++/python/除了 perl 之外的任何东西弄乱了。有什么建议么?
核心 perl 函数 rand() 不是线程安全的,我需要在线程化的蒙特卡罗模拟中使用随机数。
我很难在 CPAN 中找到关于那里的各种随机数生成器的任何注释(如果有的话)是线程安全的,而且我所做的每个谷歌搜索都被 C/C++/python/除了 perl 之外的任何东西弄乱了。有什么建议么?
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具有良好的模拟特性。
你/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。