Monte Carlo 使用 Fortran

Monte Carlo using Fortran

我正在尝试使用 RANDOM_NUMBER 进行 Monte Carlo 模拟。我正在使用 gFortran。我想执行以下操作:

  1. 计算monteNum(固定数)并生成一个随机数,monteTest。
  2. 如果 monteNum >= monteTest,则生成另一个随机数 randPos,用于 select 数组中的一行。
  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 语句会在 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 对于初始 monteTest = 0.2 始终为零,对于初始 monteTest = 0.5 始终为 randPos = 5.35517931E-03。这里,monteNum 的正确值为 0.22222。 我希望每次 运行 输出都会改变,但我每次都得到相同的输出。为什么会这样?我是否以错误的方式使用 RANDOM_NUMBER? 如有任何帮助,我们将不胜感激!

在 Fortran 中,禁止(尝试)更新循环内的索引变量。所以行

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

无法编译。

至于你的第二个片段,我没有看到任何语法错误,请解释你的意思它不起作用