2015-08-09 2 views
-2

Я пытаюсь сделать симуляцию Монте-Карло, используя RANDOM_NUMBER. Я использую gFortran. Я хочу выполнить следующее:Monte Carlo using Fortran

  1. Рассчитать monteNum (фиксированное число) и сгенерировать случайное число, monteTest.
  2. Если monteNum> = monteTest, тогда сгенерируйте еще одно случайное число randPos, которое используется для выбора строки из массива.
  3. В противном случае создайте новый 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 неправильно? Любая помощь будет оценена!

+3

Какая ошибка? Какова ценность 'monteNum'? – innoSPG

+1

См. 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

+0

Я использовал 'random_seed()', но результат все равно не меняется. – user27430

ответ

2

В Fortran запрещено (пытаться) обновить индексную переменную внутри цикла. Таким образом, линии

DO i = 1, 100 
    ... 
    ELSE 
    i = i+1 
    END IF 

не компилируется.

Что касается вашего второго фрагмента, я не вижу синтаксических ошибок, объясняю, что вы подразумеваете под , это не сработало.

Смежные вопросы