2013-03-22 2 views
0

Ядро функции perl rand() не является потокобезопасной, и мне нужны случайные числа в многопоточной моделировании монтирования.Что такое поточно-безопасный генератор случайных чисел для perl?

У меня возникли проблемы с поиском каких-либо заметок в CPAN для различных генераторов случайных чисел, в отношении которых (если они есть) потокобезопасны, и каждый поиск google, который я делаю, продолжает захламлять с помощью C/C++/python/ничего, кроме перла. Какие-либо предложения?

+2

В каком смысле это не поточно-безопасный? Вы имеете в виду, что он может генерировать одну и ту же последовательность чисел в каждом потоке? Затем все, что вам нужно сделать, это засеять его (см. 'Srand') в новом потоке/процессе после его создания. – mob

+0

Как в нем помечены как не потокобезопасные, а когда я его использую, все мои потоки складываются на одно ядро, а не правильно распределяются операционной системой :) – BrunoXSLT

+0

ОК, теперь я не знаю ЧТО НЕ РАБОТАЕТ. Я выполнил невероятно гоночный тест на резьбу, и с или без rand загрузка распределяется должным образом. Не знаю, были ли результаты мусором, хотя я этого не проверял. Ясно, что в моей программе происходит что-то труднее исправить (то есть моя ошибка). – BrunoXSLT

ответ

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); 
} 
+0

Похоже, что он недоступен в системах Windows (такого файла или каталога нет). – BrunoXSLT

-2

рэнд является поточно, и я думаю, что вы получили неправильное определение того, что «нить безопасно» означает, если его не «поточно» Это означает, что программа/функция изменения ее структуры «общие» данных, делает его выполнение в режиме потока небезопасным.

Документация по функции проверки Rand, обратите внимание, что EXPR является аргументом, в каждом потоке вы можете предоставить другой экземпляр EXPR.

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

+0

Я не понимаю вашу точку зрения о предоставлении другого EXPR в каждом потоке. Возможно, вы думаете предоставить другой EXPR для 'srand'? – mob

+0

вы можете видеть, что в примере функции EXPR может быть что угодно. В примере они использовали integer 10. int (rand (10)) –

+0

После этого объяснения, я понимаю еще меньше. – mob

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 обладает хорошими свойствами для моделирования.

Смежные вопросы