Альтернатива для генератора случайных чисел так же быстро, как erand48 () в многопоточном контексте? - PullRequest
0 голосов
/ 07 мая 2019

У меня есть многопоточная программа, где каждый поток вызывает функцию erand48 () для генерации случайного числа. Каждый поток имеет свое собственное случайное начальное число, поэтому начальное число не является общим. Тем не менее, erand48() не является потокобезопасным, как сказано в спецификации.

Я пытался заменить erand48() на random(), который является поточно-ориентированным, но он намного медленнее, и производительность - моя первая проблема.

Я также хотел бы указать, что я не знаю количество сгенерированных значений заранее, поэтому я не могу предварительно сгенерировать все значения, как предлагали другие блоги

Есть ли какая-нибудь альтернатива для erand48 () так же быстро, как и поточно-ориентированная?

Ответы [ 2 ]

3 голосов
/ 07 мая 2019

Однако erand48 () не является потокобезопасным, как указано в спецификации.

Это неправильно, erand48() был сделан специально как поточно-ориентированная версия drand48(). Цитировать Открытая группа :

Используя разные аргументы, erand48 (), nrand48 () и jrand48 () позволяют отдельные модули большой программы для генерации нескольких независимых потоки псевдослучайных чисел, то есть последовательность чисел в каждый поток не будет зависеть от того, сколько раз вызывается для генерации номеров для других потоков.

Вы просто должны убедиться, что "затравили" его в каждую ветку, возможно, как объяснено здесь:


Обновление: erand48() и аналогичные функции должны быть поточно-ориентированными, как в POSIX, но может показаться, что они не находятся в glibc , поскольку они изменяют глобальный буфер состояния генератора случайных чисел. Для обеспечения безопасности потоков вы можете использовать *_r варианты , которые являются расширением GNU. Буфер состояния генератора передается с этими функциями.

1 голос
/ 07 мая 2019

Вы рассматривали в строке кода?Вы не говорите, насколько хороший генератор случайных чисел вы хотите.Более ранние версии random () не слишком хороши для многих статистических тестов.

Если вы посмотрите «Список генераторов случайных чисел» в Википедии, в нижней части списка появится «Xoroshiro128 +», описанный как «один из самых быстрых генераторов на современных 64-битных процессорах» по ссылкам наэто страница Википедии, а затем в разделе «Реализация» вы найдете несколько версий, в том числе одну на C. Может быть, это может быть включено в ваш код с изменениями, обеспечивающими безопасность потоков (без статических переменных)?

Тамстатья о поточно-безопасном коде здесь https://www.ibm.com/support/knowledgecenter/en/ssw_aix_71/com.ibm.aix.genprogc/writing_reentrant_thread_safe_code.htm

А о поточно-безопасном генераторе случайных чисел здесь https://gist.github.com/carc1n0gen/1c3fe2fa5f1312993e1d

...