Я пишу функцию контрольной точки в своей симуляции Монте-Карло на Фортране 90/95, компилятор, который я использую, — это ifort 18.0.2, прежде чем перейти к деталям, просто чтобы уточнить версию псевдослучайного генератора, который я использую:
A C-program for MT19937, with initialization, improved 2002/1/26.
Coded by Takuji Nishimura and Makoto Matsumoto.
Code converted to Fortran 95 by Josi Rui Faustino de Sousa
Date: 2002-02-01
Исходный код см. на странице mt19937.
Общая структура моего кода моделирования Монте-Карло приведена ниже:
program montecarlo
call read_iseed(...)
call mc_subroutine(...)
end
В пределах read_iseed
subroutine read_iseed(...)
use mt19937
if (Restart == 'n') then
call system('od -vAn -N4 -td4 < /dev/urandom > '//trim(IN_ISEED)
open(unit=7,file=trim(IN_ISEED),status='old')
read(7,*) i
close(7)
!This is only used to initialise the PRNG sequence
iseed = abs(i)
else if (Restart == 'y') then
!Taking seed value from the latest iteration of previous simulation
iseed = RestartSeed
endif
call init_genrand(iseed)
print *, 'first pseudo-random value ',genrand_real3(), 'iseed ',iseed
return
end subroutine
Насколько я понимаю, если начальное значение остается постоянным, PRNG должен иметь возможность каждый раз воспроизводить псевдослучайную последовательность?
Чтобы доказать, что это так, я запустил две отдельные симуляции с использованием одного и того же начального значения, они могут воспроизвести точную последовательность. Все идет нормально!
Основываясь на предыдущем тесте, я бы также предположил, что независимо от того, сколько раз init_genrand()
вызывается в одной отдельной симуляции, PRNG также должен быть в состоянии воспроизвести последовательность псевдослучайных значений? Поэтому я немного изменил свою подпрограмму read_iseed()
.
subroutine read_iseed(...)
use mt19937
if (Restart == 'n') then
call system('od -vAn -N4 -td4 < /dev/urandom > '//trim(IN_ISEED)
open(unit=7,file=trim(IN_ISEED),status='old')
read(7,*) i
close(7)
!This is only used to initialise the PRNG sequence
iseed = abs(i)
else if (Restart == 'y') then
!Taking seed value from the latest iteration of the previous simulation
iseed = RestartSeed
endif
call init_genrand(iseed)
print *, 'first time initialisation ',genrand_real3(), 'iseed ',iseed
call init_genrand(iseed)
print *, 'second time initialisation ',genrand_real3(), 'iseed ',iseed
return
end subroutine
Вывод на удивление не тот, о котором я думал, во что бы то ни стало iseed
выходы идентичны между двумя инициализациями, однако genrand_real3()
выходы не идентичны.
Из-за этого неожиданного результата я изо всех сил пытался возобновить симуляцию в произвольном состоянии системы, поскольку симуляция не воспроизводит последнее состояние конфигурации моделируемой системы.
Я не уверен, что предоставил достаточно информации. Пожалуйста, дайте мне знать, если какая-либо часть этого вопроса должна быть более конкретной?
init_genrand
заполняет полное состояние PRNG? - person francescalus   schedule 13.06.2018init_genrand
, когда я читаю подпрограмму, мне кажется, чтоinit_genrand()
инициализируется там, где последовательность начинается с заданного начального значения, аgenrand_real3()
предоставляет значение в (0,1). Есть шанс, что вы видите какие-либо разногласия? - person Gvxfjørt   schedule 13.06.2018