Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Fortran语言进行蒙特卡罗模拟_Fortran_Montecarlo - Fatal编程技术网

用Fortran语言进行蒙特卡罗模拟

用Fortran语言进行蒙特卡罗模拟,fortran,montecarlo,Fortran,Montecarlo,我试图用随机数做蒙特卡罗模拟。我正在使用gFortran。我要执行以下操作: 计算monteNum(固定数)并生成一个随机数monteTest 如果monteNum>=monteTest,则生成另一个随机数randPos,用于从数组中选择行 否则,生成一个新的测试,直到满足步骤2 首先,我尝试使用DO循环 CALL RANDOM_SEED() monteNum = (count_up + count_dn)/(nReal**2) ! This is just a number in [0,1].

我试图用随机数做蒙特卡罗模拟。我正在使用gFortran。我要执行以下操作:

  • 计算monteNum(固定数)并生成一个随机数monteTest
  • 如果monteNum>=monteTest,则生成另一个随机数randPos,用于从数组中选择行
  • 否则,生成一个新的测试,直到满足步骤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,我认为dowhile是一个更好的选择

    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 
    
    monteTest=0.5!设置初始值。但理想情况下,它应该是随机的
    边做边做(monteNum
    但它也不起作用。 问题在于
    randPos
    对于initial
    monteTest=0.2
    randPos=5.35517931E-03
    对于initial
    monteTest=0.5
    始终为零。这里,
    monteNum
    的正确值为0.22222。 我希望每次运行它时输出都会发生变化,但每次都会得到相同的输出。为什么会这样?我是否以错误的方式使用了
    随机数

    任何帮助都将不胜感激

    在Fortran中,禁止(尝试)更新循环内的索引变量。那么台词呢

    DO i = 1, 100
       ...
      ELSE
        i = i+1
      END IF
    
    不会编译


    至于您的第二个代码片段,我看不到语法错误,请解释一下您所说的“它不起作用”是什么意思。

    错误是什么?
    monteNum
    的值是多少?请参阅,尤其是。也就是说,使用gfortran
    random_seed()
    可以产生可重复的收获。我使用了
    random_seed()
    ,但输出仍然没有改变。您使用了
    random_seed()
    ,是的。但是如果你想让gfortran有不同的随机数序列,你的呼叫是不够的。每次都需要提供不同的种子:
    random\u seed(put=seed)
    。您可以在链接问题中找到讨论的示例。