核心perl函数rand()不是线程安全的,我需要在线程蒙特卡罗模拟中使用随机数。
我在各种随机数发生器上找到CPAN中的任何音符时遇到哪些(如果有的话)都是线程安全的,而且我做的每一次谷歌搜索都会一直乱用C / C ++ / python / anything但是perl。有什么建议吗?
答案 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。