Монте-Карло с использованием Фортрана

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

  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? Любая помощь будет оценена по достоинству!


person user27430    schedule 09.08.2015    source источник
comment
В чем ошибка? Каково значение monteNum?   -  person innoSPG    schedule 09.08.2015
comment
См. stackoverflow.com/q/23875589 и, в частности, stackoverflow.com/questions/23875589/. То есть с gfortran random_seed() получается повторяемый урожай.   -  person francescalus    schedule 10.08.2015
comment
Я использовал random_seed(), но вывод все еще не меняется..   -  person user27430    schedule 10.08.2015
comment
Вы использовали random_seed(), да. Но если вы хотите иметь разные последовательности случайных чисел с помощью gfortran, вашего вызова недостаточно. Вам нужно будет каждый раз указывать разные начальные числа: random_seed(put=seed). Вы можете найти пример, обсуждаемый в связанном вопросе.   -  person francescalus    schedule 10.08.2015


Ответы (1)


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

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

не будет компилироваться.

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

person High Performance Mark    schedule 09.08.2015