蒙特卡洛使用Fortran

时间:2015-08-09 14:32:37

标签: fortran montecarlo

我正在尝试使用RANDOM_NUMBER进行蒙特卡罗模拟。我正在使用gFortran。我想执行以下操作:

  1. 计算monteNum(固定数字)并生成一个随机数monteTest。
  2. 如果monteNum> = monteTest,则生成另一个随机数randPos,用于从数组中选择一行。
  3. 否则,生成新的monteTest,直到满足第2步。
  4. 首先,我尝试使用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吗? 任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:2)

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

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

不会编译。

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