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

时间:2017-08-17 18:27:47

标签: fortran gfortran fortran90

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

  1. 使用调用random_number(x)在x和y的范围[-1,1]内的2D表面上创建一个随机放置的点。

  2. 计算该点离原点有多远,我需要为N点执行这两个步骤。

  3. 对于每个N值计算出距原点小于1的点的总量。用A = 4pir ^ 2计算pi

  4. 使用do循环计算pi作为N的函数并将其输出到数据文件。然后将其绘制在图形包中。

  5. 这就是我所拥有的:

    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的函数?

    感谢。

2 个答案:

答案 0 :(得分:0)

只需将最终计算步骤放在外部循环中,然后将n替换为i。也可以添加一个条件来限制打印结果的数量,例如i % 100 = 0每100次迭代打印一次。

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

答案 1 :(得分:0)

这是尝试进一步推进@meowgoesthedog ......

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