用Fortran语言进行蒙特卡罗模拟
我试图用随机数做蒙特卡罗模拟。我正在使用gFortran。我要执行以下操作:用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].
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
对于initialmonteTest=0.2
和randPos=5.35517931E-03
对于initialmonteTest=0.5
始终为零。这里,monteNum
的正确值为0.22222。
我希望每次运行它时输出都会发生变化,但每次都会得到相同的输出。为什么会这样?我是否以错误的方式使用了随机数
?
任何帮助都将不胜感激 在Fortran中,禁止(尝试)更新循环内的索引变量。那么台词呢
DO i = 1, 100
...
ELSE
i = i+1
END IF
不会编译
至于您的第二个代码片段,我看不到语法错误,请解释一下您所说的“它不起作用”是什么意思。错误是什么?
monteNum
的值是多少?请参阅,尤其是。也就是说,使用gfortranrandom_seed()
可以产生可重复的收获。我使用了random_seed()
,但输出仍然没有改变。您使用了random_seed()
,是的。但是如果你想让gfortran有不同的随机数序列,你的呼叫是不够的。每次都需要提供不同的种子:random\u seed(put=seed)
。您可以在链接问题中找到讨论的示例。