Я пытаюсь сделать симуляцию Монте-Карло, используя RANDOM_NUMBER. Я использую gFortran. Я хочу выполнить следующее:Monte Carlo using Fortran
- Рассчитать monteNum (фиксированное число) и сгенерировать случайное число, monteTest.
- Если monteNum> = monteTest, тогда сгенерируйте еще одно случайное число randPos, которое используется для выбора строки из массива.
- В противном случае создайте новый monteTest, пока не будет выполнен шаг 2.
Во-первых, я попытался использовать цикл DO.
CALL RANDOM_SEED()
monteNum = (count_up + count_dn)/(nReal**2) ! This is just a number in [0,1].
DO i = 1, 100
CALL RANDOM_NUMBER (monteTest)
! monteTest is a randomly generated number used in Monte Carlo simulation
IF (monteNum >= monteTest) THEN
CALL RANDOM_NUMBER (randPos)
! randPos will be used to select one flippable position randomly
Vpos = INT(randPos*count)
! position of the chosen vertex; count is the length of fList
flipVertex(1,:) = fList(Vpos,:)
ELSE
i = i+1
END IF
END DO
Ошибка возникает из-за инструкции ELSE. Так как неизвестно, что оператор IF произведет TRUE в 100 циклах, я подумал, что DO WHILE был лучшим выбором.
monteTest = 0.5 ! Setting the initial value. But ideally it should be random
DO WHILE (monteNum < monteTest)
CALL RANDOM_NUMBER (monteTest)
CALL RANDOM_NUMBER (randPos)
Vpos = INT(randPos*count)
flipVertex(1,:) = fList(Vpos,:)
END DO
Но это тоже не сработало. Проблема в том, что randPos
всегда равен нулю для начальных monteTest = 0.2
и randPos = 5.35517931E-03
для начального monteTest = 0.5
. Здесь правильное значение monteNum
равно 0.22222. Я ожидал, что выходные данные будут меняться каждый раз, когда я его запустил, но каждый раз получаю одинаковый вывод. Почему это так? Использую ли я RANDOM_NUMBER
неправильно? Любая помощь будет оценена!
Какая ошибка? Какова ценность 'monteNum'? – innoSPG
См. Http://stackoverflow.com/q/23875589 и, в частности, http://stackoverflow.com/questions/23875589/why-are-my-random-numbers-always-the-same/23875704#comment36828811_23875704. То есть, с gfortran 'random_seed()' производит повторяемый урожай. – francescalus
Я использовал 'random_seed()', но результат все равно не меняется. – user27430