Monte Carlo 使用 Fortran
Monte Carlo using Fortran
我正在尝试使用 RANDOM_NUMBER 进行 Monte Carlo 模拟。我正在使用 gFortran。我想执行以下操作:
- 计算monteNum(固定数)并生成一个随机数,monteTest。
- 如果 monteNum >= monteTest,则生成另一个随机数 randPos,用于 select 数组中的一行。
- 否则,生成一个新的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
无法编译。
至于你的第二个片段,我没有看到任何语法错误,请解释你的意思它不起作用。
我正在尝试使用 RANDOM_NUMBER 进行 Monte Carlo 模拟。我正在使用 gFortran。我想执行以下操作:
- 计算monteNum(固定数)并生成一个随机数,monteTest。
- 如果 monteNum >= monteTest,则生成另一个随机数 randPos,用于 select 数组中的一行。
- 否则,生成一个新的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
无法编译。
至于你的第二个片段,我没有看到任何语法错误,请解释你的意思它不起作用。