首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何利用蒙特卡罗模拟计算Pi?

如何利用蒙特卡罗模拟计算Pi?
EN

Stack Overflow用户
提问于 2017-08-17 18:27:46
回答 2查看 2.4K关注 0票数 2

我试图编写一个FORTRAN 90程序,它使用随机数计算Pi。这些是我知道我需要采取的步骤:

  1. 使用call random_number(x)在二维曲面上为x和y创建一个随机放置在−1,1范围内的点。
  2. 计算点离原点有多远,我需要对N个点执行这两个步骤。
  3. 对于每一个N值,计算出离原点不到1的点数总数。用A=4pir^2计算π
  4. 使用do循环计算π作为N的函数,并将其输出到数据文件中。然后将其绘制到绘图包中。

这就是我所拥有的:

代码语言:javascript
复制
program pi 
implicit none

integer :: count, n, i
real :: r, x, y
count = 0

CALL RANDOM_SEED
DO i = 1, n
 CALL RANDOM_NUMBER(x)
 CALL RANDOM_NUMBER(y)
 IF (x*x + y*Y <1.0) count = count + 1
END DO
r = 4 * REAL(count)/n
print *, r
end program pi

我知道我错过了将结果打印到数据文件中,我不确定如何实现这个结果。

这个程序为pi (3.149..)提供了一个很好的值,但是我如何实现步骤4,从而将pi的值输出为N的函数呢?

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-17 21:22:04

简单地将最后的计算步骤放在外部循环中,并将n替换为i。还可以添加一个条件来限制打印结果的数量,例如,i % 100 = 0每100次打印一次。

代码语言:javascript
复制
program pi 
implicit none

integer :: count, n, i
real :: r, x, y
count = 0

CALL RANDOM_SEED

DO i = 1, n
 CALL RANDOM_NUMBER(x)
 CALL RANDOM_NUMBER(y)
 IF (x*x + y*Y <1.0) count = count + 1

 IF ([condition])
   r = 4 * REAL(count)/i
   print *, i, r
 END IF
END DO

end program pi
票数 0
EN

Stack Overflow用户

发布于 2017-08-18 22:20:43

这里是一次尝试进一步@meowgoesthedog狗的努力。

代码语言:javascript
复制
Program pi 
implicit none

integer :: count, n, i
real :: r, x, y
count = 0
Integer, parameter :: Slice_o_Pie = 8
Integer :: Don_McLean
Logical :: Purr = .FALSE.

OPEN(NEWUNIT=Don_McLean, FILE='American.Pie')
CALL RANDOM_SEED

DO i = 1, n
  CALL RANDOM_NUMBER(x)
  CALL RANDOM_NUMBER(y)
  IF (x*x + y*Y <1.0) count = count + 1

  Purr = .FALSE.
  IF(MODULO(I, Slice_o_Pie) == 0) Purr = .TRUE.

  IF (Purr) THEN
    r = 4 * REAL(count)/i
    print *, i, r
    WRITE(LUN,*) 'I=',I,'Pi=',Pi
  END IF
END DO

CLOSE(Don_McLean)
end program pi
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45742563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档