实现思路
- 随机数生成:使用Fortran标准库中的随机数生成函数,如
RANDOM_NUMBER
。为了提高效率,可采用更高效的随机数生成器,如RANLUX
库。
- 并行化循环:使用OpenMP来并行化循环,从而利用多核CPU的优势提高执行效率。OpenMP是一种共享内存并行编程模型,通过在Fortran代码中添加特定的编译指示来实现并行化。
- 估算π:在边长为2的正方形内随机生成大量点,正方形面积为4。单位圆半径为1,面积为π。通过统计落在单位圆内的点的数量与总点数的比例,乘以4来估算π。
完整代码
program monte_carlo_pi
use omp_lib
implicit none
integer, parameter :: num_points = 100000000
integer :: i, inside_count = 0
real :: x, y, pi_estimate
real, dimension(:), allocatable :: random_x, random_y
! 分配内存
allocate(random_x(num_points), random_y(num_points))
! 生成随机数
call random_number(random_x)
call random_number(random_y)
! 并行化循环统计落在单位圆内的点
!$omp parallel do reduction(+:inside_count) private(i, x, y)
do i = 1, num_points
x = 2.0 * random_x(i) - 1.0
y = 2.0 * random_y(i) - 1.0
if (x**2 + y**2 <= 1.0) then
inside_count = inside_count + 1
end if
end do
!$omp end parallel do
! 估算π
pi_estimate = 4.0 * real(inside_count) / real(num_points)
write(*,*) 'Estimated value of pi:', pi_estimate
! 释放内存
deallocate(random_x, random_y)
end program monte_carlo_pi
代码说明
- 变量定义:
num_points
定义生成的总点数;inside_count
统计落在单位圆内的点数;pi_estimate
存储估算的π值。
- 随机数生成:使用
RANDOM_NUMBER
函数生成在[0, 1)之间的随机数,然后通过线性变换将其映射到[-1, 1]。
- 并行化:通过OpenMP的
parallel do
编译指示并行化循环,reduction
子句用于合并各个线程的inside_count
结果。
- 估算π:根据落在单位圆内的点的比例估算π值。
- 内存管理:使用
allocate
分配内存,使用deallocate
释放内存。