What is a thread-safe random number generator for

2019-08-18 23:55发布

The core perl function rand() is not thread-safe, and I need random numbers in a threaded monte carlo simulation.

I'm having trouble finding any notes in CPAN on the various random-number generators there as to which (if any) are thread-safe, and every google search I do keeps getting cluttered with C/C++/python/anything but perl. Any suggestions?

3条回答
We Are One
2楼-- · 2019-08-19 00:17

Do not use built-in rand for Monte Carlo on Windows. At least, try:

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

If nothing has changed, it should print 32768 which is utterly unsuitable for any kind of serious work. And, even if it does print a larger number, you're better off sticking with a PRNG with known good qualities for simulation.

You can use Math::Random::MT.

You can instantiate a new Math::Random::MT object in each thread with its own array of seeds. Mersenne Twister has good properties for simulation.

查看更多
走好不送
3楼-- · 2019-08-19 00:18

rand is thread safe, and I think you got the wrong definition of what "thread safe" means, If its not "thread safe" It means the program/function is modifying its "shared" data structure that makes its execution in thread mode unsafe.

Check Rand function documentation, Notice it take EXPR as argument, in every thread you can provide a different EXPR.

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

查看更多
姐就是有狂的资本
4楼-- · 2019-08-19 00:26

Do you have /dev/urandom on your system?

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);
}
查看更多
登录 后发表回答