Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从正常距离计算几个不同的随机数?使用fortran_Fortran - Fatal编程技术网

如何从正常距离计算几个不同的随机数?使用fortran

如何从正常距离计算几个不同的随机数?使用fortran,fortran,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 stuc

我必须从正态分布中找出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,这样我就不必每次尝试运行它时都输入它了。最重要的事实是,您不能重复调用
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

最重要的事实是,您不能重复调用
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

每次打印时都会给我一个不同的数字,但这是子程序的本地数字,您不会返回它以供进一步使用。(或者我误解了你的问题)。此外,不要使用“#”作为注释符号,而是使用Fortran注释符号“!”使剪切和粘贴更容易一些。此外,一些缩进也没有坏处。嗨,是的,子程序可以工作,但它会找到一个随机数,如果我想在一次运行程序时找到多个数字“n”,我不知道该怎么办。如果你不返回它,你怎么能让它输出不同的数字呢?可能以某种方式进入一个数组?在你的程序中,没有进一步使用随机数,因此很难猜测你到底想要/需要什么。每次打印时都会给我一个不同的数字,但这是子程序的局部值,你不会返回它以供进一步使用。(或者我误解了你的问题)。此外,不要使用“#”作为注释符号,而是使用Fortran注释符号“!”使剪切和粘贴更容易一些。此外,一些缩进也没有坏处。嗨,是的,子程序可以工作,但它会找到一个随机数,如果我想在一次运行程序时找到多个数字“n”,我不知道该怎么办。如果你不返回它,你怎么能让它输出不同的数字呢?可能以某种方式进入数组?在您的程序中,不再使用随机数,因此很难猜测您到底想要/需要什么。谢谢,我不知道您不应该多次调用random_seed。我不知道。我很接近,谢谢你的帮助,谢谢你,我不知道你不应该多次给random_seed打电话。我不知道。我很接近,谢谢你的帮助,