Ориентированный на многопотоковое исполнение универсальный генератор случайных чисел

Попробуйте с группой, имея пункт

select id
from table
group by id
having count(distinct variant_id) > 1
5
задан Eric Petroelje 2 March 2009 в 13:24
поделиться

7 ответов

Хороший генератор Псевдослучайного числа для Fortran90 может быть найден в Intel Math Kernel Vector Statistical Library. Они ориентированы на многопотоковое исполнение. Кроме того, почему это должно быть ориентировано на многопотоковое исполнение? Если Вы хотите, чтобы каждый поток получил тот же список, инстанцируйте нового PRNG для каждого потока с тем же семенем.

6
ответ дан 18 December 2019 в 13:19
поделиться

Большинству повторяемых генераторов случайных чисел нужно состояние в некоторой форме. Без состояния они не могут сделать то, что прибывает затем. Чтобы быть ориентированными на многопотоковое исполнение, Вам нужен способ содержать на состояние самим (т.е., это не может быть глобально).

3
ответ дан 18 December 2019 в 13:19
поделиться

Я понимаю, что Вам нужен каждый поток для создания того же потока случайных чисел.

Очень хороший Псевдослучайный Генератор, который генерирует восстанавливаемый поток чисел и довольно быстр, является MT19937. Просто удостоверьтесь, что Вы генерируете семя прежде, чем метать икру от потоков, но генерируете отдельный экземпляр MT в каждом потоке (заставьте экземпляр MT распараллелить локальный). Тем путем будет гарантироваться, что каждый MT произведет тот же поток чисел.

1
ответ дан 18 December 2019 в 13:19
поделиться

Когда Вы говорите, что "потребности генерировать ту же последовательность случайных чисел" делают Вы имеете в виду это

  • Каждый поток должен генерировать поток чисел, идентичных другому потоку? Это подразумевает выбор семени перед сниманием с потоков, затем инстанцируя локального для потока PRNG в каждом потоке с тем же семенем.

или

  • Вы хотите смочь повторить ту же последовательность чисел между различными выполнениями программ, но каждый поток генерирует свою собственную независимую последовательность? В этом случае Вы все еще не можете совместно использовать единственный PRNG, потому что операционная последовательность потока недетерминирована. Так отберите единственный PRNG с известным семенем прежде, чем запустить потоки и используйте его для генерации начальных семян для потоков. Затем Вы инстанцируете локальных для потока генераторов в каждом потоке...

В каждом из этих случаев необходимо отметить то, что Neil Butterworth говорят о статистике: большинство обычных гарантий, что PRNG нравится требовать, не надежно, когда потоки соединения генерировали таким образом.


В обоих случаях Вам нужен локальный для потока PRNG. Я не знаю то, что доступно в f90..., но можно также записать, что Вы владеете (вихрь Мерсенна поиска и пишете routne, который берет сохраненное состояние в качестве параметра...).

В Фортране 77, это посмотрело бы что-то как

      function PRNGthread (state)

      double state(statesize)

c stuff happens here which uses and manipulates the state vector...

      PRNGthread = result
      return 

и каждый из Ваших потоков должен поддержать отдельный вектор состояния, хотя все будут использовать то же начальное значение.

2
ответ дан 18 December 2019 в 13:19
поделиться

Альтернативы, кажется:

  • Используйте объект синхронизации (такой как взаимное исключение) на значении семени генератора. Это, к сожалению, сериализирует Ваш код доступов к генератору
  • Используйте локальную память потока в генераторе, таким образом, каждый поток получает свое собственное семя - это может вызвать statstical проблемы для Вашего приложения
  • Если Ваша поддержка платформ подходящая атомарная операция, будете использовать это на семени (то оно, вероятно, не будет, однако),

Не очень ободрительный список, я знаю. И добавить к нему, я понятия не имею, как реализовать любой из них в ФОРТРАНЕ!

0
ответ дан 18 December 2019 в 13:19
поделиться

Как насчет SPRNG? Я не попробовал его сам все же.

1
ответ дан 18 December 2019 в 13:19
поделиться

Я написал многопотоковую версию Mersenne Twister / MT19973 на Фортране 90. Состояние PRNG сохраняется в производном типе (randomNumberSequence), и вы используете процедуры для заполнения генератора или получения следующего элемента в последовательности.

См. http://code.google.com/p/i3rc-monte-carlo-model/source/browse/trunk/Code/RandomNumbersForMC.f95

1
ответ дан 18 December 2019 в 13:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: