核心perl函数rand()不是线程安全的,我需要在线程蒙特卡洛模拟中使用随机数。
我很难在CPAN中找到关于哪些(如果有的话)是线程安全的各种随机数生成器的注释,而且我所做的每一次google搜索都被C/C++/python/除了perl之外的任何东西弄得乱七八糟。有什么建议吗?
发布于 2013-03-23 02:16:09
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具有良好的仿真性能。
发布于 2013-03-23 00:32:47
你的系统上有/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-23 00:47:21
rand是线程安全的,我认为你对“线程安全”的定义是错误的,如果它不是“线程安全”,这意味着程序/函数正在修改它的“共享”数据结构,这使得它在线程模式下的执行是不安全的。
查看Rand函数文档,注意它将EXPR作为参数,在每个线程中可以提供不同的EXPR。
http://perldoc.perl.org/functions/rand.html
https://stackoverflow.com/questions/15574374
复制相似问题