首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >什么是perl的线程安全随机数生成器?

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

Stack Overflow用户
提问于 2013-03-22 23:42:01
回答 3查看 584关注 0票数 0

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

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

EN

回答 3

Stack Overflow用户

发布于 2013-03-23 02:16:09

Do not use built-in rand for Monte Carlo on Windows。至少,尝试一下:

代码语言:javascript
运行
复制
my %r = map { rand() => undef } 1 .. 1_000_000;
print scalar keys %r, "\n";

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

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

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

票数 2
EN

Stack Overflow用户

发布于 2013-03-23 00:32:47

你的系统上有/dev/urandom吗?

代码语言:javascript
运行
复制
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);
}
票数 1
EN

Stack Overflow用户

发布于 2013-03-23 00:47:21

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

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

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

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15574374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档