如何从正态分布计算几个不同的随机数?使用fortran

时间:2019-05-01 09:31:05

标签: fortran

在给定平均值和标准差的情况下,我必须从正态分布中找到n个随机数。我已经弄清楚了如何获得一个随机数,但是当尝试循环获得几个不同的随机数时,它给我的次数是相同的x倍?

program prac10
implicit none
real :: mu, sigma
integer :: i

!print*, "mean and stdev?"
!read*, mu, sigma
mu=1.1
sigma=0.1
do i=1, 2      # here is the part I think I am stuck on??
    call normal(mu,sigma)
enddo
end program

subroutine normal(mu,sigma)
implicit none
integer :: i
integer :: n
real :: u, v, z, randnum
real :: mu, sigma
real :: pi=3.141593

call RANDOM_SEED()
call RANDOM_NUMBER(u)
call RANDOM_NUMBER(v)
z=sqrt(-2*log(u))*cos(2*pi*v)
randnum=mu+sigma*z
print*, randnum
end subroutine

尤其是我应该循环/重复的部分。我从1:2开始使用,现在将n替换为2,这样我就不必在每次尝试运行时都输入它

1 个答案:

答案 0 :(得分:0)

最重要的事实是您不得重复呼叫RANOM_SEED。它应该被称为仅一次

修改子例程以生成数字并将其进一步传递也很好。还请注意格式的更改以使其更具可读性,以及pi值的更改。

program prac10
  implicit none
  real :: mu, sigma, x
  integer :: i

  call RANDOM_SEED()

  mu = 1.1
  sigma = 0.1
  do i = 1, 2 
      call normal(x,mu,sigma)
      print *, x
  end do
end program

subroutine normal(randnum,mu,sigma)
  implicit none
  integer :: i
  integer :: n
  real :: u, v, z, randnum
  real :: mu, sigma
  real :: pi = acos(-1.0)

  call RANDOM_NUMBER(u)
  call RANDOM_NUMBER(v)
  z = sqrt(-2*log(u)) * cos(2*pi*v)
  randnum = mu + sigma*z
end subroutine