Я пытаюсь выполнить симуляцию Монте-Карло, используя RANDOM_NUMBER. Я использую gFortran. Я хочу выполнить следующее:
- Вычислите 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
? - person innoSPG   schedule 09.08.2015random_seed()
получается повторяемый урожай. - person francescalus   schedule 10.08.2015random_seed()
, но вывод все еще не меняется.. - person user27430   schedule 10.08.2015random_seed()
, да. Но если вы хотите иметь разные последовательности случайных чисел с помощью gfortran, вашего вызова недостаточно. Вам нужно будет каждый раз указывать разные начальные числа:random_seed(put=seed)
. Вы можете найти пример, обсуждаемый в связанном вопросе. - person francescalus   schedule 10.08.2015