我正在尝试使用RANDOM_NUMBER进行蒙特卡罗模拟。我正在使用gFortran。我想执行以下操作:
首先,我尝试使用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语句会在100个循环中产生TRUE,我认为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
的{{1}}始终为零,初始monteTest = 0.2
的{{1}}始终为randPos = 5.35517931E-03
。这里,monteTest = 0.5
的正确值是0.22222。
我希望每次运行时输出都会改变,但每次都得到相同的输出。那为什么会这样?我是以错误的方式使用monteNum
吗?
任何帮助将不胜感激!
答案 0 :(得分:2)
在Fortran中,禁止(尝试)更新循环内的索引变量。所以行
DO i = 1, 100
...
ELSE
i = i+1
END IF
不会编译。
至于你的第二个片段,我看到没有语法错误,解释你的意思它不起作用。