Когда вы говорите «нужно сгенерировать одну и ту же последовательность случайных чисел», вы имеете в виду, что
- Каждый поток должен генерировать поток чисел, идентичный другому потоку? Это подразумевает выбор семени перед снятием нитей, а затем создание локального PRNG для нитей в каждой нитке с одинаковым семенем.
или
- Вы хотите иметь возможность повторять одну и ту же последовательность чисел между различными запусками программ, но каждый поток генерирует свою собственную независимую последовательность? В этом случае вы все еще не можете использовать один PRNG, потому что последовательность операций потока недетерминирована. Поэтому запустите один PRNG с известным начальным числом перед запуском потоков и используйте его для генерации начальных начальных значений потоков. Затем вы создаете локальные генераторы потока в каждом потоке ...
В каждом из этих случаев вы должны заметить, что Нил Баттерворт говорит о статистике: большинство обычных гарантий, которые ГНР любит запрашивать, не надежны , когда потоки микширования генерируются сюда.
В обоих случаях вам нужен локальный поток PRNG. Я не знаю, что доступно в f90 ... но вы также можете написать свой собственный (поиск Mersenne Twister и написать Roune, который принимает сохраненное состояние в качестве параметра ...).
В Фортране 77 это будет выглядеть примерно так:
function PRNGthread (state)
double state(statesize)
c stuff happens here which uses and manipulates the state vector...
PRNGthread = result
return
и каждый из ваших потоков должен поддерживать отдельный вектор состояния, хотя все будут использовать одно и то же начальное значение.